为什么不与实体框架“区分”呢?在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
一种可能性是您的查询包含保证不同的列,EF知道它不需要在生成的SQL中包含DISTINCT
。
我使用LINQPad和EF 4.1进行了测试。我测试的模型是一个DB first模型——我认为这无关紧要,但我觉得我应该提一下。
当查询包含PK列时,EF在调用.Distinct()
时生成相同的SQL。
当我将查询更改为只选择非pk列时,当调用.Distinct()
时,我看到DISTINCT
出现在SQL中。
如果有人能找到解决这个问题的方法,我会很高兴的。但是经过几个小时的观察,这一切都归结于我在旧视图的基础上创建一个新的视图。
我不知道这样做是否正确,但它帮助我解决了我的问题。