Создание LINQ выбрать из нескольких таблиц - PullRequest
52 голосов
/ 28 августа 2008

Этот запрос прекрасно работает:

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();

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

select op, pg).SingleOrDefault();

не работает.

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

Ответы [ 5 ]

84 голосов
/ 28 августа 2008

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

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();

Например: -)

7 голосов
/ 27 сентября 2008

Если вы не хотите использовать анонимные типы 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;
3 голосов
/ 28 августа 2008

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

 select new { op, pg }

См. Официальное руководство .

2 голосов
/ 07 апреля 2012

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

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
1 голос
/ 28 августа 2008

изменение

select op) 

до

select new { op, pg })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...