仍然无法让LINQ Include()工作 - 尽管其他帖子解释如何

时间:2014-02-04 23:28:07

标签: c# linq entity-framework entity-framework-5

我正在使用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()并没有任何区别。我不认为会这样,但无论如何我都试过了。

实体数据模型: Entity Data Model

这是我正在努力工作的查询 - 我正在使用通常的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;

2 个答案:

答案 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)

问题原来是有人在数据库中捣乱,并且该用户的权限看到该表以某种方式“丢失”。我恢复了权限,一切正常,就像你期望的那样。