Entity Framework - "タイプ 'Closure type' ...の定数値を作成できません"というエラー

entity-framework linq

質問

エラーが発生するのはなぜですか。

タイプ 'クロージャタイプ'の定数値を作成できません。このコンテキストでは、プリミティブ型(Int32、String、Guidなど)のみがサポートされています。

次のLinqクエリを列挙しようとするとどうなりますか?

IEnumerable<string> searchList = GetSearchList();
using (HREntities entities = new HREntities())
{
   var myList = from person in entities.vSearchPeople
   where upperSearchList.All( (person.FirstName + person.LastName) .Contains).ToList();
}

更新 :問題を特定するためだけに次のことを試みると、同じエラーが発生します。

where upperSearchList.All(arg => arg == arg) 

それで、問題がAllメソッドにあるように見えますね。助言がありますか?

受け入れられた回答

あなたが "WHERE ... IN"条件と同等のことをしようとしているようです。 LINQ to Entitiesでそのタイプのクエリを実行する方法の例については、 LINQ to Entities使用して「WHERE IN」スタイルのクエリを作成する方法を確認してください。

また、 .Contains後に括弧が.Containsていないため、エラーメッセージは特に.Containsません。これにより、コンパイラーは述部全体をラムダ式として認識します。


人気のある回答

私はこの6ヶ月をEF 3.5との戦いに費やしてきましたが、私は世界で最も賢い人ではありませんが、このトピックに関して役立つものがあると確信しています。

高さ50マイルの「ORスタイル」式のツリーを成長させることによって生成されたSQLは、不十分なクエリ実行計画になります。私は数百万行を扱っていますが、その影響はかなりのものです。

あなたがIDでエンティティの束を探しているのであれば手助けとなるSQLの 'in'を実行することを私が見つけた小さなハックがあります。

private IEnumerable<Entity1> getByIds(IEnumerable<int> ids)
{
    string idList = string.Join(",", ids.ToList().ConvertAll<string>(id => id.ToString()).ToArray());
    return dbContext.Entity1.Where("it.pkIDColumn IN {" + idList + "}");
}

pkIDColumnは、Entity1テーブルの主キーIDの列名です。

しかし読んでおく!

これは問題ありませんが、必要なもののIDをすでに持っている必要があります。時々私は私の表現が他の関係に届くことを望み、そして私がしているのはそれらの関連した関係の基準です。

もっと時間があれば、これを視覚的に表現しようとしますが、この文章をちょっとだけ勉強するわけではありません。Person、GovernmentId、およびGovernmentIdTypeテーブルを持つスキーマを考えます。 Andrew Tappert(Person)には、2つのIDカード(GovernmentId)があります。1つはオレゴン州(GovernmentIdType)からのもので、もう1つはWashington(GovernmentIdType)からのものです。

今すぐそれからedmxを生成します。

1234567のように、特定のID値を持つすべての人を見つけたいとしましょう。

これはこれで単一のデータベースヒットで達成することができます:

dbContext context = new dbContext();
string idValue = "1234567";
Expression<Func<Person,bool>> expr =
    person => person.GovernmentID.Any(gid => gid.gi_value.Contains(idValue));

IEnumerable<Person> people = context.Person.AsQueryable().Where(expr);

ここに副照会がありますか?生成されたSQLはサブクエリの代わりに 'join'を使用しますが、効果は同じです。最近ではSQLサーバーはとにかくカバーの下で結合にサブクエリを最適化します、しかしとにかく...

この作業の鍵は式の中の.Anyです。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ