2012-04-30 55 views
0

我正在使用LINQ to SQL(通過DBML),我需要限制並且存在問題。我正在使用動態LINQ併發送由最終用戶以前確定的變量。我有一個在數據庫中的視圖(通過左外連接)主數據庫表中的數據和5個表連接到它。因爲我(而且必須)使用動態LINQ,所以BD的結果集必須是.AsQueryable(),從而創建一個IQueryable結果集。下面是它正在做什麼的一個例子:使用LINQ to SQL獲取IQueryable結果集的不同值

可以說,該視圖可以保存汽車信息(品牌,型號,年份,顏色,米拉格,服務記錄)。 如果用戶將在他們希望看到的是,今年已提供服務的所有福特野馬,結果集中會回來這樣

[uniqueID - 1][Ford][Mustang][1/1/2012](service date) 
[uniqueID - 1][Ford][Mustang][2/1/2012](service date) 
[uniqueID - 1][Ford][Mustang][3/1/2012](service date) 
[uniqueID - 1][Ford][Mustang][4/1/2012](service date) 

這很好,讓我們假設,這個特殊的野馬已經有4個服務今年完成。

但是,如果用戶將在剛剛看到全黑色的福特那麼它回來

[uniqueID - 1][Ford][Mustang] 
[uniqueID - 1][Ford][Mustang] 
[uniqueID - 1][Ford][Mustang] 
[uniqueID - 1][Ford][Mustang] 
[uniqueID - 2][Ford][Taurus] 

它返回行的每一個服務,即使該服務會爲空,則返回擁有的IQueryable a .Distinct()。

return data.Distinct().OrderBy(strOrderBy).Select("New(" + strItems + ")"); 

我需要能夠做的,是採取的IQueryable並從中獲得不同的值,因爲在未來的變量是動態的,我不知道如何做到這一點。

+0

爲什麼會有4個服務行是空?這些行不應該不存在於服務表中嗎? – omatase

+0

@omatase問題在於服務存在,但是當我想要提取不涉及服務的數據時,我無法獲取不同的值,因爲該視圖看到服務,因此它不是獨特的。 – EvanGWatkins

回答

1

您使用的是哪個ORM? 不同的ORM具有不同的行爲,特別是如果ORM在發送到數據庫的SQL中不發送「獨特」調用。

運行該行之前,您的「數據」變量是否已解析? 如果是這樣,你正在做Linq到對象的不同,而不是Linq到SQL

在你的例子中,最直接的做法是實現一個IEqualityComparer你的查詢與第二個不同的重載。它會是這個樣子:

return data.Distinct(new YourEqualityComparer()).OrderBy(strOrderBy).Select("New(" + strItems + ")"); 

待辦事項,如果你希望你的訂單做服務器端,你將不得不推前不同的排序依據通話。

下面是與該主題相關的一些有用的鏈接:

http://msdn.microsoft.com/en-us/library/ms132151.aspx http://blog.lavablast.com/post/2010/05/05/Lambda-IEqualityComparer3cT3e.aspx http://www.codeproject.com/Articles/94272/A-Generic-IEqualityComparer-for-Linq-Distinct

+0

我在DBML上使用LINQ to SQL作爲類模型(多數民衆贊成我最好的方式來描述它) – EvanGWatkins

+0

這是你建立的一個自定義的東西?無論如何,您要查找的是一個IEqualityComparer,因此您可以在選擇前比較每列的平等性。 –

1

我懷疑.Distinct()正在對整行數據執行,並且因爲它們都有不同的服務日期,所以沒有任何重複,所以不會被.Distinct()消除。

你可以嘗試改變的方法爲:

return data.OrderBy(strOrderBy).Select("New(" + strItems + ")").Distinct();