好的,所以我写了以下功能:
private IQueryable<LogEntry> SelectAll<T>(IEnumerable<LogEntry> logEntries, List<Expression<Func<LogEntry, bool>>> whereClause)
{
var selectAllQuery = from l in logEntries select l;
if (whereClause != null)
{
foreach (Expression<Func<LogEntry, bool>> whereStatement in whereClause)
{
selectAllQuery = selectAllQuery.Where(whereClause);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它不会编译.当它尝试在"selectAllQuery"返回一些内容时抛出错误,如下所示:
System.Collections.Generic.IEnumerable'不包含'Where'的定义,最好的扩展方法重载System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable,System.Func)'有一些无效的参数
我已经尝试过这种方式,我能想到的每一种方式都无济于事.在上面的代码中,运行初始select语句返回selectAllQuery类型System.Linq.Enumerable.WhereSelectEnumerableIterator<LogEntry,LogEntry>
很显然,我遗漏了一些关于LINQ的基本知识.但是什么?
干杯.
问题是,selectAllQuery是的IEnumerable<LogEntry>,你需要的是一个IQueryable<LogEntry>为了使用表达式树.尝试更改方法的第一行:
var selectAllQuery = logEntries.AsQueryable();
Run Code Online (Sandbox Code Playgroud)
或者,在编辑谓词时将它们转换为委托形式:
foreach (Expression<Func<LogEntry, bool>> whereStatement in whereClause)
{
selectAllQuery = selectAllQuery.Where(whereStatement.Compile());
}
Run Code Online (Sandbox Code Playgroud)
编辑:好的,问题不仅仅是因为Queryable你的命名,而是因为你的命名.我们来看看这个foreach陈述:
foreach (Expression<Func<LogEntry, bool>> whereStatement in whereClause)
{
selectAllQuery = selectAllQuery.Where(whereClause);
}
Run Code Online (Sandbox Code Playgroud)
你没有whereStatement在循环体中的任何地方使用.您试图Where在每次迭代时调用整个子句列表.这是更好的命名有用的地方.试试这个,例如:
private IQueryable<LogEntry> SelectAll<T>(IEnumerable<LogEntry> logEntries,
List<Expression<Func<LogEntry, bool>>> filters)
{
var selectAllQuery = logEntries.AsQueryable();
if (filters != null)
{
foreach (var filter in filters)
{
selectAllQuery = selectAllQuery.Where(filter);
}
}
return selectAllQuery;
}
Run Code Online (Sandbox Code Playgroud)
由于参数现在是多元状态,它看起来明显错误的参数的Where方法-而之间的差别whereStatement,并whereClause不能在所有的前者是单数和后者多明显.
| 归档时间: |
|
| 查看次数: |
3203 次 |
| 最近记录: |