3

私は最初に既存のデータベースでEF4.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がこの2番目のクエリに対して生成するSQLは、テーブルに適切なインデックスがある最初のクエリよりも高速になる可能性があります(これを作成します)。問題は、この2番目のクエリが次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 に答える