2011-02-01 4 views
0

プロパティを使用せずに列名を使用することで、LINQ SELECTをより柔軟にすることはできますか? はたぶん例では、次の(擬似コード)をやろうとしhelp..I'mます:LINQクエリSELECT変数の位置を作成する方法

From x In Entities 
Where ... 
Select("ID", "Value" , "Date") 

が、特定の選択に応じて、私は異なる順序で結果を持っていると思い

From x In Entities 
Where ... 
Select("Value", "Date", "ID") 

または別の量のSELECT結果

From x In Entities 
Where ... 
Select("Value") 

これを可能な限り動的にするための助けがあれば、驚くばかりです! TNX

+0

それはあなたが(グリッド、DRの情報を表示しているされているものリストビューなど) –

+0

Extension Method Select(params string [] columnNames)を記述し、名前とクエリ可能なジェネリック型に応じて式ツリーを構築し、それをSelect に渡すことができます。しかし、あなたはタイピングを緩めるでしょう、あなたはIQueryableを返さなければなりません Guillaume86

答えて

1

私は私のコメントで言ったように多分これは(Type.Nameのようなサブプロパティ、ではなく、複数のフィールドを扱う) 私はマルチフィールドのバージョンを作る楽しさを聞かせてあなたに

from x In Entities 
where ... select new { 
    Value = x["Value"], 
    Date = x["Date"], 
    ID = x["ID"] 
} 
0

をするのに役立ちます。)

public static class DynamicLinkExtensions 
{  
    public static IEnumerable<dynamic> Select<T>(this IQueryable<T> source, string memberAccess) 
    { 
     var propNames = memberAccess.Split('.'); 
     var type = typeof(T); 
     var props = new List<PropertyInfo>(); 

     foreach (var propName in propNames) 
     { 
      var prop = type.GetProperty(propName); 
      props.Add(prop); 
      type = prop.PropertyType; 
     } 
     return source.Select(props.ToArray()); 
    } 

    public static IEnumerable<dynamic> Select<T>(this IQueryable<T> source, PropertyInfo[] props) 
    { 
     var parameter = Expression.Parameter(typeof(T)); 
     var member = Expression.MakeMemberAccess(parameter, (MemberInfo)props.First()); 

     for (var i = 1; i < props.Length; i++) 
     { 
      member = Expression.MakeMemberAccess(member, (MemberInfo)props[i]); 
     } 

     Expression<Func<T, object>> expression = Expression.Lambda<Func<T, object>>(member, new[] { parameter }); 
     return source.Select(expression); 
    } 
} 

使用法:

var names = DataContext.Customers.Select("Name").Cast<string>().ToList(); 
関連する問題