为什么不与实体框架“区分”呢?在SQL Server上

本文关键字:SQL Server 实体 框架 区分 为什么不 | 更新日期: 2023-09-27 18:14:54

我刚刚将我们的存储库和上下文从Linq-to-SQL切换到实体框架4.1 CodeFirst。

目前我所有的单元测试都通过了,除了一个!它会检查是否从sql视图中得到不同的结果

var query = worker.ObjectRepository.GetFreeObjects();
query = query.Distinct();
return query;

当我在调用。distinct()之前检查查询时,查询是正确的,当我在SQL Server上手动执行它时,它运行良好。

但是在我调用.Distinct()之后,查询看起来和以前完全一样。

如果我手动添加一个DISTINCT到我的SQL查询,它工作得很好,但在代码中调用.Distinct()不能做到这一点。

为什么?

编辑

public IQueryable<SearchResultValueObject> GetFreeObjects()
{
    return Get(Context.FreeObjects)
}
public IQueryable<TEntity> Get<TEntity>(IQueryable<TEntity> query)
{
    return query;
}

我简化了一点,因为在这个场景中,这就是所发生的一切。从上下文中抓取数据,并返回它。

这是我的上下文的样子

public class MyContext : DbContext, IMyContext
{
    public virtual DbSet<SearchResultValueObject> SearchResult { get; set; }
    IQueryable<SearchResultValueObject> IMyContext.FreeObjects { get { return this.SearchResult; } }
}

我还试图从SearchResultMap-file中删除除objectNo之外的所有内容,我从Db中得到了结果,但.Distinct()不起作用。

Edit2

我做了一个简单的例子,有同样的问题:http://pastebin.com/sYVfNb0Y这和我从视图中取回有关系吗?还是我遗漏了什么重要的东西?

致以最亲切的问候Jesper

为什么不与实体框架“区分”呢?在SQL Server上

一种可能性是您的查询包含保证不同的列,EF知道它不需要在生成的SQL中包含DISTINCT

我使用LINQPad和EF 4.1进行了测试。我测试的模型是一个DB first模型——我认为这无关紧要,但我觉得我应该提一下。

当查询包含PK列时,EF在调用.Distinct()时生成相同的SQL。

当我将查询更改为只选择非pk列时,当调用.Distinct()时,我看到DISTINCT出现在SQL中。

如果有人能找到解决这个问题的方法,我会很高兴的。但是经过几个小时的观察,这一切都归结于我在旧视图的基础上创建一个新的视图

我不知道这样做是否正确,但它帮助我解决了我的问题。