【问题标题】:C# Dynamic LINQ Contains using an array only evaluates the first valueC# Dynamic LINQ Contains 使用数组仅计算第一个值
【发布时间】:2021-01-19 23:02:57
【问题描述】:

C# 相对较新,并开始使用动态 LINQ 使用字符串过滤数据表适配器。我遇到的问题是 Where 子句似乎只评估字符串中的第一个值,而没有评估其他值。这是我正在使用的代码。

        string[] ids = new string[] { "12345", "67891", "45878" };
        var resultQ = (from pr in table1 select pr).AsQueryable();
        var iq = resultQ.Where("@0.Contains(FieldName)", ids);  

它只适用于第一个值“12345”,因此 iq 的输出显示“12345”的所有字段。我尝试使用 linq.dynamic.core 来查看是否会有所帮助,但结果仍然相同(或者我没有正确使用它)。我知道我可能在这里遗漏了一些小东西,但我们将不胜感激。

另外说明:我想将 iq 的最终结果(IQueryable 类型)转换为 EnumerationRowCollection 类型。这可能吗?

提前致谢

【问题讨论】:

  • 什么是prtable1 变量?请提供完全可重现的代码。
  • 您好,table1 指的是表适配器(table1 = TableAdapter1.GetData();),pr 只是用于行的范围变量。这不是与动态 LINQ 包含语句没有获取数组中的所有值有关的问题。干杯

标签: c# linq iqueryable dynamic-linq


【解决方案1】:

就用这个吧。它会正常工作的。

string[] ids = new string[] { "12345", "67891", "45878" };

var resultQ = (from pr in table1 select pr).AsQueryable();

var iq = resultQ.Where(w => ids.Contains(w.Id)).ToList();

【讨论】:

  • 非常感谢赛义德,这也有效!我还想将该 iq 列表转换为 EnumerableRowCollection 类型,这可能吗?干杯
  • 欢迎。 ToList 无法满足您的要求?你想要什么然后告诉我
  • 我想在另一种 LINQ 方法中使用 iq 进行分组和求和。我已将 LINQ 方法添加到一个函数中,以便在多个不同的地方使用参数,但是当我使用以下内容时,我得到一个“带有语句体的 lamda 表达式无法转换为表达式树”。不使用 IQueryable .Select(g => { DataRow row = table1.NewRow(); row[field] = g.Key; row[aggr] = g.Sum(r => r.Field(aggr) );
【解决方案2】:

现在设法解决了这两个问题。将 string[] 设置为动态 LINQ 的字符串,以获取列表中的所有值,如下所示

string ids =  "12345,67891,45878";
var resultQ = (from pr in table1 select pr).AsQueryable();
var iq = resultQ.Where("@0.Contains(FieldName)", ids); 

或使用 Syed 的建议并更改 LINQ 查询并保留数组(再次感谢 Seyed)

为了将 IQueryable 类型转换为 EnumerationRowCollection,我将 EnumerationRowCollection 更改为 IEnumerable,这适用于我的所有 LINQ 查询

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    相关资源
    最近更新 更多