实体框架不一致 - 在这里工作,不在那里

时间:2012-06-19 20:34:13

标签: c# linq entity-framework

我首先使用现有数据库处理EF 4.1代码。我有一个看起来像这样的课程:

class myClass
{
    [Key]
    [Column("SomeID", Order=0)]
    public int SomeID { get; set; }

    [Key]
    [Column("Dt", Order=1)]
    public DateTime StartDate { get; set; }

    public String SomeValue { get; set; }
    public int SomeOtherValue { get; set; }
}

我正在尝试获取具有特定SomeValue的最新SomeOtherValue的记录的值(即StartDateSomeID)。我对查询的第一次尝试是:

(from x in myContext.myClassDbSet
where x.SomeID == myVariable
orderby x.StartDate descending
select x).FirstOrDefault()

这很好用,但我意识到它不是最佳的,所以我尝试将其更改为以下内容:

(from x in myContext.myClassDbSet
where x.SomeID == myVariable
      && x.StartDate == (from x2 in myContext.myClassDbSet
                         where x2.SomeID == x.SomeID
                         select x2.StartDate).Max()
select x).FirstOrDefault()

LINQPad为第二个查询生成的SQL可能比第一个在表上具有适当索引(我愿意创建)的SQL更快。问题是第二个查询会抛出SystemArgumentException消息:

  

类型'System.Data.Objects.ObjectQuery'1 [myClassDbSet]'的对象无法转换为类型'System.Data.Entity.DbSet'1 [myClassDbSet]'。

这是在查询声明中引发的,而不是在尝试执行它时。

最奇怪的是,在不同类中的相同查询(字面上复制和粘贴)工作正常。谁知道我做错了什么?

1 个答案:

答案 0 :(得分:1)

你可能不会喜欢这个答案,但是我想如果你想要优化linq输出的sql那么麻烦,那么只需在sql中编写它就更容易了。