entity framework查询中令人难以置信的重复

针对特定视图的SQL查询返回3个不同的行。

select * from vwSummary where vidate >= '10-15-2010' and vidate <= '10-15-2010' and idno = '0330' order by viDate 

但是如果我通过我的entity framework运行相同的查询,我得到3行,但所有3行都相同,相当于第三行。

  firstVisibleDate = new DateTime(2010, 10, 15); lastVisibleDate = new DateTime(2010, 10, 15); var p1 = (from v in db.vwSummary where v.viDate >= firstVisibleDate && v.viDate <= lastVisibleDate && v.IDNo == "0330" select v).ToList(); 

有人可以帮我解决这个问题。

编辑:我改变了我的查询,这是有效的。 但是我仍然想回到上面显示的那个,因为我必须再次迭代以进行更多处理。

 List p1 = (from v in db.vwSummary where v.viDate >= firstVisibleDate && v.viDate <= lastVisibleDate && v.IDNo == "0330" select new  { a = va b = vb } ).ToList(); 

我有一个类似的问题,我通过更改ObjectSet的合并选项解决了它。 例:

  using (TargetDBDataContext db = new TargetDBDataContext()) { db.SomeView.MergeOption = System.Data.Objects.MergeOption.NoTracking; return db. SomeView.ToList(); } 

看起来entity framework(EF)无法正确处理具有重复主键或根本没有主键的视图。 因此,当有两行EF考虑相等时,EF会按原样加载第一行,但不会加载第二行,因为它会认为它已经加载了。

entity framework提供了许多性能调优选项,可帮助您优化应用程序的性能。 其中一个调整选项是.AsNoTracking()。 此优化允许您告知entity framework不跟踪查询的结果。 这意味着entity framework不会执行查询返回的实体的其他处理或存储。 但是,这也意味着您无法更新这些实体,而无需将它们重新连接到跟踪图。

您可以直接在视图上设置AsNoTracking选项以解决此问题。

context.viewname。 AsNoTracking()Where( x => x.ColumnName!= null);

在视图的实体模型上设置实体键。 这在两个不同的实例中对我有用。 您可以在密钥中使用一个或多个属性。

解决方法 :我改变了我的查询,它可以工作。 但是我仍然想回到上面显示的那个,因为我必须再次迭代以进行更多处理。

 List p1 = (from v in db.vwSummary where v.viDate >= firstVisibleDate && v.viDate <= lastVisibleDate && v.IDNo == "0330" select new  { a = va b = vb } ).ToList(); 

我从这里和这里找到了问题的根源。 我猜这应该是一个问题,因为我的观点中没有一个非常好的关键,因为该视图更像是一个摘要报告。 所以我坚持我在其他答案中找到的解决方法。

因此,如果您发现类似的问题,问题是,为您的表或视图添加正确的主键。 如果你不能添加一个类似于解决方法的东西。

我刚刚遇到这个问题,并认为这是我的实现,直到我找到这篇文章。 我设法工作的唯一解决方法是实际运行sqlquery,如下所示: –

 using(var db = new Tpr.Models.MyContext()) { var model = _uow._context.Database.SqlQuery(string.Format("select * from MyTable where ID = '{0}'", "12345678")); Assert.IsNotNull(model); }