我有一个简单但同时也是烦人的问题。我尝试在业务层中为CRUD操作创建通用方法。特定要求应为某些对象包含所有导航属性,并应作为List返回。
请查看两个代码示例:
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的反馈,现在问题很明显了。如果调用dbQuery.Include(...),则不会更改dbQuery中的sql命令。因此,您需要将结果分配给另一个查询。我提供以下代码,适用于有相同问题的其他人:
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();
}
答案 0 :(得分:1)
请尝试以下代码:
{
...
var query = dbQuery.Include(x=>x.Location);
list = query.ToList();
...
}
答案 1 :(得分:1)
我想我找到了一个解决方案,并想在这里发帖给其他有同样问题的人。
如果您更改此代码
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();
}
然后它有效。
但我不确定这是否是处理问题的最佳方式。