Создание 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?
Ответы
Ответ 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 })