繁体   English   中英

LINQ查询中的where子句不根据数据求值

[英]Where clause in LINQ query doesn't evaluate against data

我用以下语句填充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子句中指定客户时where它似乎就无法正确评估。 我确定我的问题是句法上的,但是在参考LINQ文档之后,我有点不确定我要去哪里。

您有两个Select呼叫。 第一个将原始集合投影到具有三个属性( ResourceNameQuantityCustomerName )的动态对象的集合。 然后,您第二次调用Select将该项目集合到另一个Customer实例集合中,但是只设置了该类的两个属性( ResourceNameQuantity )。 您没有在第二个选择中设置CustomerName ,因此Where调用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

只需切换的最后SelectWhere

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实际上创建了一个全新的阵列中的每个时刻,它可以是昂贵的这样做,所以你要确保你做的项目尽可能最少的,由首先使用所有查询,以便首先拥有所有需要的项目,然后才能创建数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM