我正在使用EF 5.0.0,当我通过TabNumber查询时,我正急切地加载飞机的PerformancePackages,但无论我把它放在查询中的什么地方,我都无法让它工作。
我的存储库中的相关代码:
public class ReadOnlyRepository<T> : IGenericRepository<T>
where T : class
{
private bool disposed;
protected DbContext context;
protected DbQuery<T> dataset;
public ReadOnlyRepository() : this(null) { }
public ReadOnlyRepository(DbContext context)
{
this.context = context ?? new MyDataContext();
dataset = this.context.Set<T>().AsNoTracking();
disposed = false;
if (dataset.IsNull())
throw new ArgumentException(string.Format("Cannot create dataset of type {0} from supplied context.", "context", typeof(T).Name));
}
public IQueryable<T> All()
{
return dataset;
}
}
*注意:我只是为了嘻嘻哈哈,离开.AsNoTracking()并没有任何区别。我不认为会这样,但无论如何我都试过了。
实体数据模型:
这是我正在努力工作的查询 - 我正在使用通常的All()方法的存储库:
var tabNumbers = "..." // a comma delimited string of tab numbers
var results = repo.All()
.Where(p => tabNumbers.ToUpper().Contains(p.TabNumber))
.Include(p => p.PerformancePackages)
.GroupBy(p => p.Model)
其他编辑:
我尝试使用.Take(10)
并暂停.GroupBy()
(以及将.Include()
移至.Where()
之前)来简化查询,但它仍会返回0结果:
var results = repo.All()
.Include(p => p.PerformancePackages)
.Take(10)
我还试图用.Include("PerformancePackages")
的老式方式做到这一点,但这也不起作用:
var results = repo.All()
.Include("PerformancePackages")
.Take(10);
我期望的输出是“超过零”的性能包(因为没有性能包的数据库中没有飞机)。我已经愚弄了一个计数器,让我很容易看到我收到了多少性能包,到目前为止计数总是为零:
List<int> counter = new List<int>(results.Count());
foreach(var ap in airplanes)
{
counter.Add(ap.PerformancePackages.Count());
}
结果:
counter[0] = 0;
counter[1] = 0;
counter[2] = 0;
counter[3] = 0;
counter[4] = 0;
counter[5] = 0;
counter[6] = 0;
counter[7] = 0;
counter[8] = 0;
counter[9] = 0;
答案 0 :(得分:2)
如此处所述(http://blogs.msdn.com/b/alexj/archive/2009/06/02/tip-22-how-to-make-include-really-include.aspx),当您将投影数据的形状更改为实体以外的任何内容时,Include()将无效。
在这种情况下,GroupBy将最终结果更改为一堆IGrouping,这将使上述条件无效。没有分组测试,你应该看到它工作。
答案 1 :(得分:0)
问题原来是有人在数据库中捣乱,并且该用户的权限看到该表以某种方式“丢失”。我恢复了权限,一切正常,就像你期望的那样。