动态linq表达式查询,获取问题
本文关键字:获取 问题 查询 linq 表达式 动态 | 更新日期: 2023-09-27 18:13:44
我尝试按照要求在查询中连接4个表。当我想在where子句中动态地添加条件时,我现在可以为2个表查询做到这一点。但是这个4表连接有点复杂。为了扩展功能,我使用以下代码添加动态where子句:
public static class Extensions
{
public static IQueryable<T> AddEqualityCondition<T, V>(this IQueryable<T> queryable,
string propertyName, V propertyValue)
{
ParameterExpression pe = Expression.Parameter(typeof(T), "p");
IQueryable<T> x = queryable.Where<T>(Expression.Lambda<Func<T, bool>>(Expression.Equal(Expression.Property(pe, typeof(T).GetProperty(propertyName)), Expression.Constant(propertyValue, typeof(V)), false, typeof(T).GetMethod("op_Equality")), new ParameterExpression[] { pe }));
return (x);
}
}
//我添加where条件的代码:
Query is:
var agrs = (from agr in _dbContext.Agreements
join amdv in _dbContext.AgreementMetaDataValues on agr.AgreementID equals amdv.AgreementID
join emd in _dbContext.EntityMetadatas on amdv.AttributeId equals emd.AttributeId
join et in _dbContext.Entities on agr.EntityID equals et.EntityId
select new agr, amdv,emd });
//Add dynamically where conditions:
agrs = agrs.AddEqualityCondition("?????", "A83C82C5-F9D6-4833-A234-EBB5D971280C");
这适用于2个表连接,而不是更多。因为在复杂查询中,它生成的是匿名对象。所以那么,我应该通过什么来代替"??????"的标记…?通常需要将属性名传递为"agr"。但这里它抛出表达式为"值不能为空:propertyName"在扩展类。
我想你可能会考虑这样做(作为额外的重载):
public static IQueryable<T> AddEqualityCondition<T, V>(
this IQueryable<T> queryable,
Expression<Func<T, V>> selector, V propertyValue)
{
var lambda = Expression.Lambda<Func<T,bool>>(
Expression.Equal(
selector.Body,
Expression.Constant(propertyValue, typeof(V)),
false, typeof(T).GetMethod("op_Equality")),
selector.Parameters);
return queryable.Where(lambda);
}
使用:和
agrs = agrs.AddEqualityCondition(x => x.agr.AgreementId,
"A83C82C5-F9D6-4833-A234-EBB5D971280C");
然而!直接使用
要容易得多。agrs = agrs.Where(x => x.agr.AgreementId ==
"A83C82C5-F9D6-4833-A234-EBB5D971280C");
最好使用谓词构建器,即动态组合表达式谓词