2013-10-30 49 views
2

與LINQ運營商很多時候我都需要類似這樣的疑問:SQL 'IN' 在Visual Studio LightSwitch中

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])包含([10007]。城市),不支持......」

回答

0

試試這個:

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

這種方式,您將調用Enumerable.Contains並沒有列出。包含。

0

使用數組而不是List <>

var filteredcustomers = custs.Where(c => months.ToArray().Contains(c.City)); 
1

首先,感謝雙方@danielrozo和回答問題@ sh1ng。 問題是,這兩個建議在運行時不起作用,當我在代碼的某個時候嘗試執行.Execute()查詢或執行foreach循環(當查詢實際執行時),並且我認爲我終於明白爲什麼:

this.DataWorkspace.ApplicationData.Customers; 

這是EntitySet,我發現它不支持全套LINQ運算符(它不支持'Contains')。它僅支持受限制的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()返回來自服務器(本例中爲客戶)的所有記錄,如果我們有很多記錄,這可能會影響性能。

我希望這會幫助別人。

相關問題