Pat*_*ley 4 c# linq predicate where predicatebuilder
我正在使用PredicateBuilder创建一个动态Where子句来查询DataTable中的数据.我有一个包含我需要搜索的列名和值的字典.我只是迭代字典,如果键匹配列名,则将该键和值添加到谓词.一切似乎工作正常,直到对数据表运行实际查询,我得到零记录:(但如果我用p => p ["年"] =="2010"之类的东西替换动态谓词,我得到记录回来.这是代码:
var objectList = table.AsEnumerable();
Func<DataRow, bool> predicate = GetPredicate(parms, table.Columns);
var list1 = objectList.Where(predicate).ToList();
private static Func<DataRow, bool> GetPredicate(Dictionary <string, string> parms, DataColumnCollection dataColumnCollection)
{
var predicate = PredicateBuilder.False<DataRow>();
foreach (var parm in parms)
{
if (dataColumnCollection.Contains(parm.Key))
{
var copy = parm;
predicate = predicate.And(p => p[copy.Key] == copy.Value);
}
}
return predicate.Compile();
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激:)
你开始false然后添加and条款.
false && ...总是返回false,所以你的Where子句永远不会匹配任何东西.
尝试从以下开始:
var predicate = PredicateBuilder.True<DataRow>();
Run Code Online (Sandbox Code Playgroud)
也:
您关闭了一个循环变量,这意味着所有的谓词将使用最后parm在parms.
您可以通过在循环中创建本地副本来解决此问题:
foreach( var parm in parms )
{
if (dataColumnCollection.Contains(parm.Key))
{
var copy = parm;
predicate = predicate.And( p => p[ copy.Key ] == copy.Value );
}
Run Code Online (Sandbox Code Playgroud)
更新:
DataRow[ key ]是类型object,因此p[ copy.Key ] == copy.Value,等于运算符是对象引用相等,而不是字符串相等.
您可以通过指定String.Equals:
predicate = predicate.And( p => String.Equals( p[ copy.Key ], copy.Value ) );
Run Code Online (Sandbox Code Playgroud)
有趣的是,这个例子表明你可以有多个string具有相同内容的实例.
| 归档时间: |
|
| 查看次数: |
777 次 |
| 最近记录: |