【问题标题】:Unable to pass multiple values in the where clause of a LINQ query无法在 LINQ 查询的 where 子句中传递多个值
【发布时间】:2014-01-30 13:24:58
【问题描述】:

我有一个类似于下面的 LINQ 查询:

var results=from p in inputTable.AsEnumerable()
          where inputParameter.Contains(p.Field<String>(inputField))&&
                p.Field<string>(CurrencyCode)==currencyCode
          group p by new
          {
           p[CurrencyCode],
          } into groupedTable
          select new
          {
           Amount = groupedTable.Sum(r => r.Field<System.Decimal>(amountField))
          };
if (results.Count() > 0)
            {
                retVal = results.ElementAt(0).Amount;
            }

我的inputParameter 基本上是List&lt;string&gt;,其值类似于{October, November, December}

inputFieldNovember

我的想法是,由于 where 条件有一个 Contains 方法,它只会按 November 过滤行,因为 inputFieldNovember

我基本上需要通过列表的所有元素,即OctoberNovemberDecember,然后得到这些月份过滤的记录。

我尝试使用LINQwhere-in 的东西,但没有成功。

请专家帮忙解决这个问题。 任何帮助/指针都会非常有用。

编辑:

让我试着让这个问题变得非常简单。

我的List&lt;string&gt;inputParameter可以包含变量字符串,比如{October, November, December}或者{January, February, March, April}等等。

我需要我的查询传入所有这些值并相应地过滤记录。

我尝试的简化查询如下:

var results=from p in inputTable.AsEnumerable()
            where p.Field<string>(FiscalMonth)==inputParameter[0] ||
                  p.Field<string>(FiscalMonth)==inputParameter[1] ||
                  p.Field<string>(FiscalMonth)==inputParameter[2]
            select new
                {
                 p.Amount
                 };

在上面的例子中,我基本上对列表inputParameter 的各个元素进行了硬编码,但我的列表有时会发生变化。即它可能包含 3 个项目、4 个项目,甚至 12 个项目。

如何塑造上述查询以避免个别硬编码?

问候

阿努拉格

【问题讨论】:

  • 什么不起作用?您的代码似乎按预期处理 List
  • 先生。 Marko,我需要在 where 子句中传递整个字符串,即我需要获取 Oct、Nov、Dec 的结果。目前,上面的查询只给了我 11 月的结果,它作为 inputField 参数传递。
  • 如果您将inputParamter 设置为new List&lt;string&gt;() {"October", "November", "December"},您的代码应该可以正常工作。 inputFieldinputTable 中列的名称,而不是筛选字段。
  • 是的,表中的列的名称也很奇怪,我一直期待 ????_Month 或类似的名称。
  • Tony:inputField 基本上是作为参数传递给编写此 LINQ 查询的函数

标签: c# linq list


【解决方案1】:

响应您的编辑,它应该是:

var results = from p in inputTable.AsEnumerable()
              where inputParameter.Contains(p.Field<string>(FiscalMonth))
              select new
                {
                    p.Amount
                };

这是一个工作控制台示例,演示使用 Contains 进行查询:

//create datatable with column FiscalMonth
var table = new DataTable();
table.Columns.Add("FiscalMonth");

//add two rows, January and October
var row1 = table.NewRow();
row1["FiscalMonth"] = "January";
var row2 = table.NewRow();
row2["FiscalMonth"] = "October";
table.Rows.Add(row1);
table.Rows.Add(row2);

//query from data table where FiscalMonth in (October, November, December)
var inputParameter = new List<string> {"October", "November", "December"};
var result = from r in table.AsEnumerable()
             where inputParameter.Contains(r.Field<string>("FiscalMonth"))
             select r.Field<string>("FiscalMonth");

//the result will be only one row, which is October. January is successfully filtered out
foreach (var r in result)
{
    Console.WriteLine(r);
}

【讨论】:

  • 我目前正在使用您编写的上述查询进行调试...会让您知道结果。
  • 我不确定这部分 p.Amount。如果您在该部分发现异常,请尝试使用Amount = p.Field&lt;System.Decimal&gt;(Amount) 之类的方法,其中Amount 是DataTable 中的列名,System.Decimal 是该列的数据类型。
  • p.Amount 部分很好。但我没有得到正确的结果,har07 先生。即使输入参数是 {October, November} 或 {October, November, December},我也会得到相同的结果。你说什么?如果我需要过滤具有多个值的列,例如(select * from dbo.Table where ID in (1,2,3)),它会为我提供 ID 为 1,2 或 3 的记录。我在这里想要同样的东西,但是使用 LINQ。 Contains 方法没有给出预期的结果。还有其他想法吗?
  • 我建议改为检查您的数据。我在控制台项目中对其进行了测试,查询按预期工作
  • Yes..Mr har07..我的输入表只有 11 月,因此它只给我 11 月的结果,无论我通过什么列表。一些数据不明确..感谢您的时间和精力。
【解决方案2】:

并不真正了解您在寻找什么,因为您说您只想查询月份,而您的代码正在查询月份和货币代码。但看起来你正在返回金额的总和。所以他是你想做的事情的第一个尝试。

class MonthCurrency
    {
        public string Month { get; set; }
        public int CurrencyCode { get; set; }
        public decimal Amount { get; set; }
    }
    static List<MonthCurrency> inputTable  = null;

    static void Main(string[] args){
        inputTable = new List<MonthCurrency>()
        {     new MonthCurrency() { Month = "October", CurrencyCode= 1, Amount = 1},
              new MonthCurrency() { Month = "October", CurrencyCode= 1, Amount = 2},
              new MonthCurrency() { Month = "November", CurrencyCode= 2, Amount = 1},
              new MonthCurrency() { Month = "November", CurrencyCode= 2, Amount = 2},
              new MonthCurrency() { Month = "December", CurrencyCode= 3, Amount = 1},
              new MonthCurrency() { Month = "December", CurrencyCode= 3, Amount = 2},
        };   
        var result = GetCurrencyCode("November");
    }

    static public decimal GetCurrencyCode(string inputParameter)
    {
        decimal retVal = 0.0M;
        var results = from p in inputTable.AsEnumerable()
                      where p.Month == inputParameter
                      group p by new
                      {
                          p.CurrencyCode,
                      } into groupedTable
                      select new MonthCurrency
                      {                              
                          Amount = groupedTable.Sum(r => r.Amount)
                      };
        if (results.Count() > 0)
        {
            retVal = results.ElementAt(0).Amount;
        }
        return retVal;
    }

希望对你有所帮助

【讨论】:

  • 劳伦斯先生,我明白你的意思。你能告诉我如何在 LINQ 查询的 where 子句中传递整个 List 吗?
  • 整个列表是什么意思?喜欢从数据中返回所有内容吗?
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多