Подтвердить что ты не робот

Создание 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();

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

select op, pg).SingleOrDefault();

не работает.

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

4b9b3361

Ответ 1

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

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

Если вы не хотите использовать анонимные типы 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

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

 select new { op, pg }

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

Ответ 4

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

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

Ответ 5

изменить

select op) 

к

select new { op, pg })