2016-04-11 6 views
3

Я хочу, чтобы добавить динамическое выражение LINQ, но сталкивается с проблемами, от того, содержит метод, который он прекрасно работает на равных методLINQ Выражение Содержит

Проблема в Я получаю FilterField динамически, как заменить в запросе

Так далеко я попытался

List<int> Ids = new List<int>(); 
**string filterField ="DEPARTMENT"; ==> Dynamic Field** 

var eParam = Expression.Parameter(typeof(EmployeeDetail), "e"); 

var comparison = Expression.Equal(Expression.Property(eParam, filterField), Expression.Convert(Expression.Constant(Ids), Expression.Property(eParam, filterField).Type)); 

var lambda = Expression.Lambda<Func<EmployeeDetail, bool>>(comparison, eParam); 

var countMonthly1 = ctx.tblMonthlyInput.Join(ctx.tblEmployee, a => a.CompanyId, b => b.CompanyId, (a, b) => b).Where(lambda).Count(); 

Я хочу сделать выше запрос работает Содержит метод с использованием выражения Linq

образца д uery:

var countMonthly = (from a in ctx.tblMonthlyInput 
        join b in ctx.tblEmployee on a.CompanyId equals b.CompanyId 
        where categoryId.Contains(a.CategoryId) //want to make this dynamic 
        select a).Count() == 0; 
+0

Не могли бы вы отправить код, который скомпилируется? –

+0

Вам нужно будет получить метод 'List.Contains' и вызвать его через' Expression.Call() '. – Rob

+0

Образец запроса @Thomas, который я упомянул, компилируется правильно, но проблема в том, что я хочу сделать ('a.CategoryId') динамический – Nilesh

ответ

4

Это будет работать для вас:

void Main() 
{ 
    var filterField = "Id"; 
    List<int> Ids = new List<int>(); 
    var eParam = Expression.Parameter(typeof(EmployeeDetail), "e"); 
    var method = Ids.GetType().GetMethod("Contains"); 
    var call = Expression.Call(Expression.Constant(Ids), method, Expression.Property(eParam, filterField)); 
    var lambda = Expression.Lambda<Func<EmployeeDetail, bool>>(call, eParam); 
} 

public class EmployeeDetail 
{ 
    public int Id { get; set; } 
} 

Во-первых, обратите внимание на Contains метода по типу Ids. Затем мы просто вызываем его с помощью Ids в качестве экземпляра, а свойство в качестве аргумента

 Смежные вопросы

  • Нет связанных вопросов^_^