LINQ查询中的Where子句不针对数据进行求值

时间:2015-08-19 00:49:56

标签: c# linq collections

我使用以下语句填充ObservableCollection

foreach (var customer in
    collListItem.Select(
        item =>
        new
            {
                ResourceName = item["Resource_x0020_Name"].ToString(),
                Quantity = (item["Quantity_x0020_Ordered"] ?? 0).ToString(),
                CustomerName = item["Title"].ToString()
        })
        .Select(r => new Customer { ResourceName = r.ResourceName, Quantity = int.Parse(r.Quantity) })
        .Where(r => r.CustomerName == "test"))
{
    resources.Add(customer);
}

当我删除LINQ查询的.Where()部分时,该语句将获取所有客户。我想将此限制为我指定的客户。每当我在where子句中指定客户时,它似乎都没有正确评估。我确定我的问题是语法上的,但在参考LINQ文档后,我有点不确定我哪里出错了。

2 个答案:

答案 0 :(得分:4)

您有Select两次来电。第一个将原始集合投影到具有三个属性(ResourceNameQuantityCustomerName)的动态对象集合。然后,您对Select的第二次调用将该集合项目投射到另一个Customer实例集合中,但只设置了该类的两个属性(ResourceNameQuantity)。您没有在第二个选择中设置CustomerName,因此在调用Where时它未初始化。

我认为你真的只想要一个Select的调用,它结合了两个调用并跳过创建动态对象。

例如:

foreach (var customer in
    collListItem.Select(
        item =>
        new Customer {
                ResourceName = item["Resource_x0020_Name"].ToString(),
                Quantity = (item["Quantity_x0020_Ordered"] ?? 0),
                CustomerName = item["Title"].ToString()
        }
    )
    .Where(r => r.CustomerName == "test"))
{
    resources.Add(customer);
}

我假设item["Quantity_x0020_Ordered"]已经是一个整数,因为你通过??运算符将它与一个整数相结合。因此,无需第一次选择的ToString来电或第二次来的int.Parse来电。

答案 1 :(得分:1)

只需使用Select

切换最后Where
foreach (var customer in
    collListItem.Select(
        item =>
        new
            {
                ResourceName = item["Resource_x0020_Name"].ToString(),
                Quantity = (item["Quantity_x0020_Ordered"] ?? 0).ToString(),
                CustomerName = item["Title"].ToString()
            })
        .Where(r => r.CustomerName == "test")
        .Select(r => new Customer { ResourceName = r.ResourceName, Quantity = int.Parse(r.Quantity) }))
{
    resources.Add(customer);
}

或像这样崩溃

resources.AddRange(collListItem
    .Where(item => item["Title"].ToString() == "test")
    .Select(item =>
        new Customer {
            ResourceName = item["Resource_x0020_Name"].ToString(),
            Quantity = item["Quantity_x0020_Ordered"] ?? 0
        }
     )
 );

您始终要先查询Where之前Select),因为Select每次都会创建一个全新的数组,这样做可能会很昂贵,所以你想要首先使用所有查询,确保尽可能少地使用项目,这样您就可以获得所需的所有项目,然后就可以创建数组了。