2012-03-15 6 views
0

エンティティのプロパティに対してハードコードされていないプロパティに対してクエリを実行する方法はありますか(結果のLINQ)?EFを使用してコンパイル時に不明なプロパティを照会する

たとえば、検索機能に使用できるものがあります。

public IList<Entity> Search (string propertyName, object value) { 

    // something that'll do the following 
    return context.Set<Entity>() 
     .Where(x => x.propertyName == value) 
     .ToList() 
     ; 
} 
+0

をそれを使用しますこれで何をしたのですか?私は同じことが必要な自分自身を見つける。マルチフィールド検索の場合。私はこの例のようにDataTablesではなくEFを使用しています。 http://demos.telerik.com/aspnet-ajax/controls/examples/integration/gridandcombo/defaultcs.aspx?product=grid – hardba11

答えて

0

Property Descriptor

次のコードは、必要なものをやっているようだ:

string propertyName = "Length"; 
List<string> testList = new List<string>(); 

testList.Add("String1"); 
testList.Add("String10"); 
testList.Add("String100"); 
testList.Add("String1000"); 

System.ComponentModel.PropertyDescriptorCollection props = System.ComponentModel.TypeDescriptor.GetProperties(typeof(string)); 

System.ComponentModel.PropertyDescriptor desc = props.Find(propertyName, false); 

IEnumerable<object> obj = from env in testList 
      select desc.GetValue(env); 

foreach (object it in obj) 
{ 
    Console.WriteLine(it.ToString()); 
} 
+0

linqからオブジェクトへの洗練されたソリューションです。ただし、Entity Frameworkのクエリは決してSQLに変換されません。 –

0

あなたが構築することができ、この

private static Expression<Func<TEntity, bool>> BuildEqualExpression<TEntity>(string propertyName, object value) 
{ 
    var param = Expression.Parameter(typeof(TEntity), "x"); 
    var body = Expression.MakeBinary(ExpressionType.Equal, 
     Expression.Property(param, propertyName), Expression.Constant(value)); 

    return Expression.Lambda<Func<TEntity, bool>>(body, new ParameterExpression[] { param }); 
} 

のような手動式を等しくして、あなたのLINQクエリで

var expression = BuildEqualExpression<TEntity>(propertyName, value); 
return context.Set<TEntity>().Where(expression).ToList(); 
関連する問題