LINQ表达式中的Contains函数

15

我希望在linq中添加动态表达式,但是在contains方法上遇到了问题,对于Equal方法它可以完美地工作。

问题在于我正在动态获取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表达式使上面的查询适用于Contains方法。
示例查询:
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;

你能发布一段可以编译的代码吗? - Thomas Weller
你需要获取 List.Contains 方法并通过 Expression.Call() 调用它。 - Rob
@Thomas 我提到的示例查询可以正确编译,但问题是我想要使 (a.CategoryId) 动态化。 - Nilesh Gajare
@rob 我尝试了同样的方法 https://dev59.com/a0zSa4cB1Zd3GeqPoJ50 但是不知道为什么它没有按照预期工作。 - Nilesh Gajare
1个回答

24

这个方法适用于您:

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; }
}
首先,您需要在Ids类型上查找Contains方法。然后,我们只需将其实例化为Ids,并将属性作为参数调用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接