我首先使用现有数据库处理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
的记录的值(即StartDate
,SomeID
)。我对查询的第一次尝试是:
(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]'。
这是在查询声明中引发的,而不是在尝试执行它时。
最奇怪的是,在不同类中的相同查询(字面上复制和粘贴)工作正常。谁知道我做错了什么?
答案 0 :(得分:1)
你可能不会喜欢这个答案,但是我想如果你想要优化linq输出的sql那么麻烦,那么只需在sql中编写它就更容易了。