Я поддерживаю API, который на основе запроса списка людей возвращает другой набор результатов, основанный на запросе. Например, некоторые клиенты API хотят получить список людей и список их взаимодействий, другие хотят людей и список своих метаданных. Все это можно указать в запросе метода API, который возвращает людей.Entity Framework - условно включать связанные объекты
Это не появляется на работу:
using (var dbcontext = new ExampleEntities())
{
var query = dbcontext.People.AsQueryable();
//determined in earlier application logic based on request
if(includeMetadata)
{
query = query.Include("metadata");
}
//determined in earlier application logic based on request
if(includeInteractions)
{
query = query.Include("interactions");
}
/* ...SNIP... */
}
То, что я не хочу, чтобы сделать это:
var query = dbcontext.People.Include("Metadata").Include("interactions");
, который будет означать, каждый запрос, чтобы получить человек, будет включать в себя все связанные с ними объектов, даже если запрашивающий клиент API им не нужен.
Я также не хочу, чтобы закодировать все возможные комбинации логики:
if(includeMetadata && includeInteractions)
{
var query = dbcontext.People.Include("Metadata").Include("interactions");
}
else if(includeMetadata)
{
var query = dbcontext.People.Include("Metadata");
}
else if(includeInteractions)
{
var query = dbcontext.People.Include("Interactions");
}
else
{
var query = dbcontext.People;
}
Это приведет к затруднению в обслуживании кода, однако, я понимаю, что я мог бы код генерировать это в случае необходимости.
Возможно ли это только в другой версии Entity Framework? я получаю следующее сообщение об ошибке: Ошибка \t \t 37 «System.Linq.IQueryable» не содержит определение для «Включить» и не метод расширения «не включать» принятие первого аргумента типа «System.Linq.IQueryable '(вы не указали директиву по использованию или ссылку на сборку?) Возможно, отсутствует сборка расширений? –
Цепочки - это стандартная функция LINQ. Но 'Include' - это метод расширения EF (http://msdn.microsoft.com/en-us/library/gg696450%28v=vs.103%29.aspx) и требует ссылки на сборку EntityFramework.dll и добавление' используя System.Data.Entity; 'также удалите это' AsQueryable() '. – VahidN
Хорошо. Я был смущен, так как мог позвонить. Включить в dbcontext.SomeTable, но не someQuery. После того, как я добавил необходимый импорт, он работал нормально. Я уже исправлял EntityFramework.dll –