2011-06-27 3 views
1

これを達成するために式とLambdasを使用する方法があることは知っていますが、私はすべて一緒につなぎ合わせるのに苦労しています。私が必要とするのは、Entity Framework DBSetオブジェクトを動的にクエリして、指定された名前のプロパティが値と一致する行を見つけるメソッドです。私はむしろそうので、それを示唆する必要がこれを実現しないように、動的SQLを使用する必要はありませんEntity Framework 4.1 object.property = valueのシンプルな動的式

public T Get<T>(string property, object value) : where T is Account 
{...} 

マイコンテキスト:

public class MyContext : DbContext 
{ 
    public IDbSet<Account> Accoounts{ get { return Set<Account>(); } } 
} 

私が書くために探しています方法私はすでにそれが可能であることを知っています。私が本当に探しているのは、式とLambdaを使用してこれを達成するための助けです。

事前に感謝しますが、私は簡単ですが、それはかなり自明です。詳細情報が必要な場合はコメント

答えて

1

ダイナミックLinqはオプションです。条件を文字列として指定すると、式として構築され、データに対して実行されます。

私が行ったことの例です。

var context = new DataContext(ConfigurationManager.ConnectionStrings["c"].ConnectionString); 
var statusConditions = "Status = 1"; 
var results = (IQueryable)context.Contacts.Where(statusConditions); 

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

2

LINQの主なポイントは、強く型付けされたアクセスをされたので、私はできる限りの動的LINQを避けるためにしようとしています。動的linqの使用は解決策ですが、linqの目的とはまったく反対であり、ESQLを使用して、スティング連結からクエリを構築するのにはかなり近いです。とにかく動的linqは時にはリアルタイムの節約になります(特に複雑な動的順序付けの場合)、Linq-to-SQLを使った大規模なプロジェクトでもうまく使用できます。これは、一般的な解決策ではありません

public static IQueryable<SomeClass> Filter(this IQueryable<SomeClass> query, SearchCriteria filter) 
{ 
    if (filter.Property1 != null) query = query.Where(s => s.Property1 == filter.Property1); 
    if (filter.Property2 != null) query = query.Where(s => s.Property2 == filter.Property2); 
    return query; 
} 

public class SearchCriteria 
{ 
    public string Property1 { get; set; } 
    public int? Property2 { get; set; } 
} 

とヘルパークエリ拡張メソッドのように:私は通常、いくつかのSearchCriteriaクラスのように定義されない

。やはり一般的な解決策は、いくつかの振る舞いを共有するクラスの厳密な型付けされた処理です。

より複雑な解決策は、述語ビルダーとビルド式ツリーを使用することですが、式ツリーを作成することは、文字列を連結してESQLクエリを構築するほうがずっと複雑です。

public T Get<T>(string property, object value) : where T is Account 
{ 
    //p 
    var p = Expression.Parameter(typeof(T)); 

    //p.Property 
    var propertyExpression = Expression.Property(p, property); 

    //p.Property == value 
    var equalsExpression = Expression.Equal(propertyExpression, Expression.Constant(value)); 

    //p => p.Property == value 
    var lambda = Expression.Lambda<Func<T,bool>>(equalsExpression, p); 

    return context.Set<T>().SingleOrDefault(lambda); 
} 

それはEF 5のSet<T>()メソッドを使用しています。

1

は、ここに私の実装です。より低いバージョンを使用している場合は、<T>タイプに基づいてDbSetを取得する方法を実装する必要があります。

希望します。

関連する問題