2017-01-19 9 views
2

同じクエリに対していくつかの呼び出しがありますが、わずかに異なるWHERE句を使用していますが、列名として変数を渡すことが可能かどうかは誰にもわかりますそれを達成する。MVC Linq WHERE節の動的列名を使用したクエリ

私は以下が正しいとは限りませんが、あなたに私が達成しようとしていることのアイデアを伝えることを知っています。

public EmailUserListViewModel EmailUserListData(int CaseId, string ColumnName) 
{ 
    CaseId = CaseId, 
    EmailUserList = (from u in efContext.PgsUsers 
         where ColumnName == true 
         orderby u.FirstName, u.LastName 
         select new EmailUserListModel 
         { 
          UserId = u.Id, 
          Name = ((u.FirstName == null) ? "" : u.FirstName) 
            + ((u.LastName == null) ? "" : " " + u.LastName), 
          Email = u.Email, 
          Checked = false 

         }).ToList() 
    }; 
} 
+5

(http://stackoverflow.com/questions/848415/dynamic-where-clause-in-linq) – Nico

+0

あなたが「U」変数を使用する必要がある[LINQでの句は、動的]の可能性のある重複どこに。だからu == ColumnNameのようなもの – jdweng

答えて

2

は、私はあなたが動的にプロパティの値を取得するためにリフレクションを使用することができたと

from u in efContext.PgsUsers where (typeof(PgsUser).GetProperty(ColumnName).GetValue(u) as bool) == true 

または

from u in efContext.PgsUsers where (u.GetType().GetProperty(ColumnName).GetValue(u) as bool) == true 
+0

私はこれに似たものを試してみて、同じエラーを受け取りました: '' System.Reflection.PropertyInfo GetProperty(System.String) 'はSQLへの変換をサポートしていません。' – JBoom

+0

The ReflectionフィルタがSQL互換でない場合は、クエリのToList()バージョンに適用する必要があります。 –

1

あなたは、このような方法で記述することができます。

public Expression<Func<T, bool>> getExpression<T>(string columnName) 
{ 
    var param = Expression.Parameter(typeof(T)); 
    var equal = Expression.Equal(Expression.Property(param, columnName), Expression.Constant(true)); 
    return (Expression<Func<T, bool>>)Expression.Lambda(equal, param); 
} 

をし、次の場所で使用してください:

where getExpression<YourType>("ColumnName") 
関連する問題