2008-08-28 5 views
48

Этот запрос работает отлично:Создание LINQ выбрать из нескольких таблиц

var pageObject = (from op in db.ObjectPermissions 
        join pg in db.Pages on op.ObjectPermissionName equals page.PageName 
        where pg.PageID == page.PageID 
        select op) 
       .SingleOrDefault(); 

получить новый тип с моими полями «оп». Теперь я хочу также получить поля «pg», но

select op, pg).SingleOrDefault(); 

не работает.

Как я могу выбрать все из обеих таблиц, чтобы они отображались в моем новом типе pageObject?

ответ

79

Вы можете использовать анонимные типы для этого, а именно:

var pageObject = (from op in db.ObjectPermissions 
        join pg in db.Pages on op.ObjectPermissionName equals page.PageName 
        where pg.PageID == page.PageID 
        select new { pg, op }).SingleOrDefault(); 

Это сделает pageObject в IEnumerable анонимного типа так AFAIK вы не сможете передавать его другим методам, однако, если вы просто получаете данные для воспроизведения в методе вы в настоящее время в полном порядке. Можно также назвать свойства в вашем анонимного типа, а именно: -

var pageObject = (from op in db.ObjectPermissions 
        join pg in db.Pages on op.ObjectPermissionName equals page.PageName 
        where pg.PageID == page.PageID 
        select new 
        { 
         PermissionName = pg, 
         ObjectPermission = op 
        }).SingleOrDefault(); 

Это позволит вам сказать: -

if (pageObject.PermissionName.FooBar == "golden goose") Application.Exit(); 

Например :-)

2

Вы должны создать новый анонимный тип:

select new { op, pg } 

Обратитесь к официальному guide.

1

изменение

select op) 

в

select new { op, pg }) 
6

Если вы не хотите для использования анонимных типов b/c предположим, что вы передаете объект другому методу, вы можете использовать параметр LoadWith load для загрузки связанных данных. Это требует, чтобы ваши таблицы были связаны либо через внешние ключи, либо в вашей модели dbml Linq-to-SQL.

db.DeferredLoadingEnabled = false; 
DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<ObjectPermissions>(op => op.Pages) 
db.LoadOptions = dlo; 

var pageObject = from op in db.ObjectPermissions 
     select op; 

// no join needed 

Тогда вы можете позвонить

pageObject.Pages.PageID 

В зависимости от того, что выглядит как ваши данные, вы, вероятно, хотите, чтобы сделать это наоборот,

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Pages>(p => p.ObjectPermissions) 
db.LoadOptions = dlo; 

var pageObject = from p in db.Pages 
       select p; 

// no join needed 

var objectPermissionName = pageObject.ObjectPermissions.ObjectPermissionName; 
2

Если анонимный тип вызывает проблемы для вас, вы можете создать простой класс данных:

public class PermissionsAndPages 
{ 
    public ObjectPermissions Permissions {get;set} 
    public Pages Pages {get;set} 
} 

, а затем в запросе:

select new PermissionsAndPages { Permissions = op, Page = pg }; 

Затем вы можете передать это вокруг:

return queryResult.SingleOrDefault(); // as PermissionsAndPages 
Смежные вопросы