0

Ok、

EF5の既知のエンティティから不明な数の列を選択し、不明な数の列でフィルタリングする述語を作成する必要があります。そのうちの1つは常に子コレクションの名前になります。

だからこれは私が最終的にする必要があるものです

var q = db.Set<Entity>()
          .Where(e => e.Code.Contains("q") || e.Translations.FirstOrDefault(t => t.Culture.ID == "whatever").Description.Contains("q"))
          .Select(e => new
                       {
                           e.ID,
                           e.Code,
                           Name = e.Translations.FirstOrDefault(t => t.Culture.ID == "whatever").Description
                       });

しかし、式の述語を構築する方法がわかりません

e.Translations.FirstOrDefault(t => t.Culture.ID == "whatever").Description.Contains("q")

選択する列とフィルターするフィールドは文字列の配列として提供され、この場合、フィルターには常にが含まれます。

私は述語の作成に精通していますが、それは問題ではありません。これまで子コレクションを調べる必要がなかっただけでなく、その日の完全な「WTF」ポイントにいます:-)

正しい方向へのすべてのプッシュが最も適切です。

4

1 に答える 1

2

1つのアプローチは、DynamicLinqを使用することです。http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspxを参照してください

下の3番目のクエリを見ると、次のようなことができるはずです。

 e.Translations
.Where("Culture.ID = 'whatever'") //Conditions defined as string as per example
.FirstOrDefault() //etc.

に関してselect an unknown number of columns from a known entity in EF5 AND filter by an unknown number of columnsは、使用する前に文字列を作成するために必要な式を使用できます。'contains'句については、もう少し複雑です-ここで説明されているメソッドを参照してください-動的LinqでString.Containsを記述する方法

EF5にアクセスできないため、実際にはテストしていませんが、DynamicLinqにEF5ベースの質問があるようです(動作するはずです)-https: //stackoverflow.com/questions/9929396/entity-framework -5-0-performance-with-dyanmic-linq

また、この目的にはPredicateBuilderを使用したいのですが、フィールド名を事前に知っている/何らかのリフレクションを使用しないとできないと思います(Linqクエリでの動的列名の使用を参照)。上記のアプローチを示唆するこの回答( https://stackoverflow.com/a/2497335/201648 )を認めることも価値があります。

また、ここで説明されているように、ラムダを使用してフィールドの条件付きルールを設定することもできます:http: //www.codeproject.com/Articles/28580/LINQ-and-Dynamic-Predicate-Construction-at-Runtime

// use tryparse to make sure we don't run a bogus query.
if (cbxUseEmployeeID.Checked &&
    int.TryParse(filterEmployeeId.Text, out emplId) &&
    emplId > 0) {

    // here's how simple it is to add a condition to the query.
    // Still not executing yet, just building a tree.
    predicate = predicate.And(e => e.EmployeeID == emplId);
}

これでも、私が見る限り、可能なフィールドのセットを知っている必要があります(私はまだそれがクールで言及する価値があると思います)。

于 2013-02-15T12:13:36.527 に答える