2013-01-04 74 views
0

在此查詢排序依據前後除

var list = (from t in ObjectCollection 
      select t).OrderBy(v => v.Date) 
      .Except(from i in items select i.value).OrderBy(v => v. 

在第一排序依據lambda表達式顯示日期屬性,但在第二個排序依據事實並非如此。爲什麼?

編輯#1 ObjectCollectionitems是不同類型的。 ObjectCollection是學生的集合,而items是學生ID的集合。現在我看到了這個問題。我如何排除那些ID爲items的學生?

+1

當你粘貼了你的代碼,你至少省略了一行。請添加它。 –

+0

@Ofer不,它會停止它的工作,因爲他期待'v.Date'並且它不會出現在Intellisense中。 bjan,你的'ObjectCollection'和'items'集合是什麼?如果你只是在'Except'之後結束你的查詢,你的代碼是否被編譯? – Rawling

+0

'i.value'與ObjectCollection的元素具有相同的類型? –

回答

2

如果ObjectCollectioni.value子句中返回的值具有兼容類型,則應檢查您的對象。 我已經用LinqPad和Visual Studio做了一個簡單的測試 - 並且它一切正常。請注意,我的v.Date表達式返回DateTime的實例,i.value也返回的是Datetime的實例,因此Except方法對兩個兼容的數據序列進行操作。 LinqPad版本enter image description here 的Visual Studio版本 enter image description here

編輯:你應該嘗試使用comething像下面給出的查詢。 Except方法採用相同的類型的兩個序列,並從第一個序列中刪除元素,這些元素出現在第二個序列中。謝謝@lazyberezovsky我會通過將studentToExclude序列帶入內存來更新我的答案。

var studentsToExclude = items.Select(i => i.Value).ToList(); 

var result = from student in ObjectCollection 
      where !studentsToExclude.Contains(student.ID) //I suppose your IDs are stored here 
      orderby student.Date 
      select student; 
+0

但這裏兩個列表的類型是不一樣的?我排除了ID在第二個列表中的學生 – bjan

+0

列表類型不相同,但在內部查詢中,您選擇了「i.value」,但不是「i」 –

+0

我更新了包含查詢的答案,幫你。 –

2

貌似你試圖讓學生使用標識不中的項目清單:

var values = items.Select(i => i.Value).ToList(); 
var list = ObjectCollection.Where(v => !values.Contains(v.ID)) 
          .OrderBy(v => v.Date); 

或用連接(如果在項目列表中沒有重複):

var list = from v in ObjectCollection 
      join i in items on v.ID equals i.Value 
      orderby v.Date 
      select v; 
+0

You are right,+1 – bjan

+1

@bjan btw apply'.ToList()'否則'從我的項目中選擇i.value'將會爲每個學生執行 –

+0

+1好答案。我更新了我的尊重你的筆記,如果你不介意的話,當然 –