私は最初に既存のデータベースで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
、 )を取得しようとしています。クエリでの最初の試みはこれでした: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がこの2番目のクエリに対して生成するSQLは、テーブルに適切なインデックスがある最初のクエリよりも高速になる可能性があります(これを作成します)。問題は、この2番目のクエリが次SystemArgumentException
のメッセージとともにをスローすることです。
タイプ'System.Data.Objects.ObjectQuery'1[myClassDbSet]'のオブジェクトをタイプ'System.Data.Entity.DbSet'1[myClassDbSet]'に変換することはできません。
これは、実行しようとしたときではなく、クエリ宣言でスローされます。
最も奇妙なことは、別のクラスの同じクエリ(文字通りコピーして貼り付ける)が正常に機能することです。誰かが私が間違っていることを知っていますか?