У меня есть простая, но в то же время неприятная проблема. Я пытаюсь создать общие методы для операций CRUD в Business Layer. Существует определенное требование, чтобы все свойства навигации были включены для некоторых объектов и должны быть возвращены в виде списка.
Посмотрите на оба примера кода:
List<Event> list;
using (var db = new DbContext())
{
db.Configuration.ProxyCreationEnabled = false;
var dbQuery = db.Set<Event>();
list = dbQuery.Include(x => x.Location).ToList();
}
Над фрагментом кода работает нормально, как ожидалось.
List<Event> list;
using (var db = new DbContext())
{
db.Configuration.ProxyCreationEnabled = false;
var dbQuery = db.Set<Event>();
// foreach(var np in navigationProperties) -> I omitted this block and only included one property to keep it simple
dbQuery.Include(x => x.Location);
list = dbQuery.ToList();
}
Над фрагментом кода не работает (отлично работает в EF4). Причина, по которой мне нужен второй блок, заключается в том, что свойства навигации, которые всегда должны быть включены, сохраняются в отдельном файле манифеста, а через цикл foreach они включаются в зависимости от типа объекта.
Кажется, что оба они очень такие же, но на самом деле нет. Я не мог найти решение и нуждаюсь в вашей помощи.
Заранее благодарю за любые комментарии/отзывы.
ОБНОВЛЕНИЕ (с РЕШЕНИЕМ): Благодаря отзывам Masoud'd, проблема теперь ясна. если вы вызываете dbQuery.Include(...), то команда sql в dbQuery НЕ изменяется. Поэтому вам нужно присвоить результат другому запросу. Я предоставляю следующий код, который отлично подходит для других, у кого такая же проблема:
List<Event> list;
using (var db = new DbContext())
{
db.Configuration.ProxyCreationEnabled = false;
var dbQuery = db.Set<Event>();
DbQuery<Event> query = null;
foreach (var navigationProperty in navigationProperties)
{
if(query==null)
query = dbQuery.Include(navigationProperty);
else
query = query.Include(navigationProperty);
}
if (query != null) list = query.ToList();
}
Попробуйте следующий код:
{
...
var query = dbQuery.Include(x=>x.Location);
list = query.ToList();
...
}
Я думаю, что нашел решение и хочу публиковать его для других, у кого такая же проблема.
Если вы измените этот код
List<Event> list;
using (var db = new DbContext())
{
db.Configuration.ProxyCreationEnabled = false;
var dbQuery = db.Set<Event>();
dbQuery.Include(x => x.Location);
list = dbQuery.ToList();
}
в
List<Event> list;
using (var db = new DbContext())
{
db.Configuration.ProxyCreationEnabled = false;
var dbQuery = db.Set<Event>();
dbQuery.Include(x => x.Location).Load();
list = dbQuery.ToList();
}
то это работает.
Но я не уверен, что это оптимальный способ решения проблемы.