我正在尝试创建一个AndAlso
将在查询Where
方法中使用的动态过滤器:LINQ-to-EF
query.Where(filterExpression)
filterExpression
编译的 lambda在哪里
到目前为止,我已经实现了一个带有一些奇特用法的循环来检查只有一个、两个或多个查询的情况。
Expression selectLeft = null;
Expression selectRight = null;
Expression filterExpression = null;
foreach (QueryColumn columnQuery in querycolumns)
{
Expression<Func<FileColumnRecords, bool>>
columnPredicate = d => d.fcv.Any(f => (f.value != null ?
f.value.ToLower().Contains(columnQuery.queryTerm.ToLower()) :
false));
if (selectLeft == null)
{
selectLeft = columnPredicate.Body;
filterExpression = selectLeft;
continue;
}
if (selectRight == null)
{
selectRight = columnPredicate.Body;
filterExpression =
Expression.AndAlso(selectLeft, selectRight);
continue;
}
filterExpression =
Expression.AndAlso(filterExpression, columnPredicate.Body);
}
然后我设置了一个ParameterReplacer
以确保我的表达式参数的所有迭代都获得相同的引用:
ParameterExpression param = Expression.Parameter(typeof(FileColumnRecords), "p");
ParameterReplacer replacer = new ParameterReplacer(param);
filterExpression = replacer.Visit(filterExpression);
它是由:
class ParameterReplacer : ExpressionVisitor
{
private readonly ParameterExpression parameter;
internal ParameterReplacer(ParameterExpression parameter)
{
this.parameter = parameter;
}
protected override Expression VisitParameter
(ParameterExpression node)
{
return parameter;
}
}
(ParameterReplacer
课程由JonSkeet提供)
运行时出现ParameterReplacer
以下错误:
"Property 'System.String value' is not defined for type 'Models.FileColumnRecords'"
其中FileColumnRecords
定义为:
public class FileColumnRecords
{
public Documents doc;
public IEnumerable<FileColumnValues> fcv;
}
并且FileColumnValues
作为:
public partial class FileColumnValues
{
public long ID { get; set; }
public long CNID { get; set; }
public long fileID { get; set; }
public string value { get; set; }
}