2

我经常需要类似这样的查询:

SELECT * FROM Customers  
WHERE City IN ('Paris','London');

我有一些列表(通常是字符串)。当列表很小时(例如这样),这不是一个问题,我可以写这样的东西(C#):

Customers custs = this.DataWorkspace.ApplicationData.Customers;
var filteredcustomers = custs.Where(c=>c.City == "Paris" || c=>c.City == "London");

但如果我有更大的清单,那就有点笨拙了。我试过这个(来自某个论坛):

List<string> months = new List<string>() {"Jan", "Feb", "Mar"......"Dec"};
Customers custs = this.DataWorkspace.ApplicationData.Customers; 
var filteredcustomers = custs.Where(c => months.Contains(c.City));

但我收到运行时错误:
“{System.NotSupportedException: 不支持表达式值(System.Collections.Generic.List`1[System.String]).Contains([10007].City)....”

4

3 回答 3

1

首先,感谢@danielrozo 和@sh1ng 回答这个问题。问题是,这两个建议在运行时都不起作用,当在代码中的某个时刻我尝试 .Execute() 查询或执行 foreach 循环(当查询实际执行时),我想我终于弄清楚了原因:

this.DataWorkspace.ApplicationData.Customers;  

这是 EntitySet,我发现它不支持全套 LINQ 运算符(它不支持“包含”)。它仅支持有限的 LINQ 运算符。如果列表是例如:

List<string> cities = new List<string>() {"Paris", "London", "Berlin", "Moscow",.....};

我像这样修改'custs':

var custs = this.DataWorkspace.ApplicationData.Customers.GetQuery().Execute();

它返回 IEnumerable 对象,我们可以使用它在本地进行过滤。IEnumerable 支持全套 LINQ 运算符,现在这两个建议都有效。例如来自@danielrozo

var fi = from fcusts in custs where custs.Any(x => cities.Contains(x.City)) select fcusts;

现在,这也有效:

var filteredcustomers = custs.Where(c => cities.Contains(c.City));  

我也可以求和(需要时):

decimal total = custs.Where(c => cities.Contains(c.City)).Sum(c => c.Points);

我们需要在这里小心,因为 .GetQuery().Execute() 从服务器返回所有记录(在本例中为客户),如果我们有很多记录,这可能会影响性能。

我希望这会对某人有所帮助。

于 2013-10-31T16:17:19.583 回答
0

使用数组而不是 List<>

var filteredcustomers = custs.Where(c => months.ToArray().Contains(c.City));
于 2013-10-31T11:03:46.807 回答
0

尝试这个:

var filteredCustomers = from fcusts in custs where custs.Any(x=>x.Contains<string>(x.City)) select fcusts;

这样,您将调用 Enumerable.Contains 而不是 List.Contains。

于 2013-10-31T09:07:38.530 回答