gpt4 book ai didi

c# - PredicateBuilder 返回零记录

转载 作者:太空狗 更新时间:2023-10-30 00:32:58 24 4
gpt4 key购买 nike

我正在使用 PredicateBuilder 创建动态 Where 子句以从 DataTable 查询数据。我有一个字典,其中包含我需要搜索的列名和值。我只是遍历字典,如果键与列名匹配,则将该键和值添加到谓词。在针对数据表运行实际查询之前,一切似乎都正常,我得到零记录:(但是如果我用 p => p["Year"] == "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();
}

任何帮助将不胜感激:)

最佳答案

您从 false 开始,然后添加 子句。

false && ... 始终返回 false,因此您的 Where 子句永远不会匹配任何内容。

尝试从:

开始
var predicate = PredicateBuilder.True<DataRow>();

还有:

您正在关闭一个循环变量,这意味着您的所有谓词都将使用 parms 中的最后一个 parm

您可以通过在循环中创建本地副本来解决此问题:

foreach( var parm in parms )
{
if (dataColumnCollection.Contains(parm.Key))
{
var copy = parm;
predicate = predicate.And( p => p[ copy.Key ] == copy.Value );
}

更新:

DataRow[ key ]object 类型,所以在 p[ copy.Key ] == copy.Value 中,相等运算符是对象引用相等性,而不是字符串相等性。

您可以通过指定 String.Equals 来解决这个问题:

predicate = predicate.And( p => String.Equals( p[ copy.Key ], copy.Value ) );

有趣的是,这个例子表明您可以有多个具有相同内容的 string 实例。

关于c# - PredicateBuilder 返回零记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14322669/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com