3

我首先使用现有数据库使用 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, ) 。我对查询的第一次尝试是这样的:SomeOtherValueStartDateSomeID

(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]' 类型。

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

最奇怪的是,不同类中的相同查询(字面意思是复制和粘贴)可以正常工作。有人知道我在做什么错吗?

4

1 回答 1

1

您可能不会喜欢这个答案,但我认为如果您在优化 linq 输出的 sql 时遇到这么多麻烦,那么在 sql 中编写它会更容易。

于 2012-06-28T21:48:09.417 回答