我使用以下语句填充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文档后,我有点不确定我哪里出错了。
答案 0 :(得分:4)
您有Select
两次来电。第一个将原始集合投影到具有三个属性(ResourceName
,Quantity
和CustomerName
)的动态对象集合。然后,您对Select
的第二次调用将该集合项目投射到另一个Customer
实例集合中,但只设置了该类的两个属性(ResourceName
和Quantity
)。您没有在第二个选择中设置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
每次都会创建一个全新的数组,这样做可能会很昂贵,所以你想要首先使用所有查询,确保尽可能少地使用项目,这样您就可以获得所需的所有项目,然后就可以创建数组了。