2010-03-30 79 views
1

我的主要實體被稱爲[合同]。合同與[服務]有許多2種關係。linq排序很多2很多問題

當我查詢的合同清單我搶可用這樣的第一服務:

IQueryable<Contract> q = ctx.Contracts.Skip(startRow - 1).Take(pgSize); 
q.Select(c => 
     new ContractSearchResult() 
     { 
      ContractID = c.ContractID, 
      FirstService = c.Contract2Service.FirstOrDefault().Service.Name, 
      ServiceCount = c.Contract2Service.Count, 
     } 
     ).ToList(); 

(當我顯示這個名單我展示FirstService如果只有1。如果> 1我秀「My1stService (3)「顯示我看到3個服務的第一個)這工作正常。

我的問題是這樣的:

有什麼辦法由FirstService排序?或者這是不可能的?我還沒有找到在linq中表達這種方式,並允許分頁。

任何幫助,將不勝感激。

回答

1
q.OrderBy(c => c.Contract2Service.FirstOrDefault().Service.Name) 
.Select(c => 
     new ContractSearchResult() 
     { 
      ContractID = c.ContractID, 
      FirstService = c.Contract2Service.FirstOrDefault().Service.Name, 
      ServiceCount = c.Contract2Service.Count, 
     } 
    ) 
.ToList(); 

除非我失去了你的問題的東西(這是可能的),它應該是爲調用OrderBy()您的來電Select()

+0

是的,它的複雜性在於選擇之前應該發生排序,以便分頁正常工作。 – user169867 2010-03-30 13:36:48

+0

@user我更新了答案,以便在選擇之前進行排序。 – 2010-03-30 13:43:49

+0

我明白了,我認爲這可能有效。你偶然會知道一種將OrderBy操作作爲「動態Linq」字符串的方式嗎? – user169867 2010-03-30 13:53:14

2

你需要OrderBy之前,你的頁面。

var result = ctx.Contracts 
    .Select(c => 
     new ContractSearchResult() 
     { 
      ContractID = c.ContractID, 
      FirstService = c.Contract2Service.FirstOrDefault().Service.Name, 
      ServiceCount = c.Contract2Service.Count, 
     }) 
.OrderBy(x => x.FirstService) 
.Skip(startRow - 1) 
.Take(pgSize) 
.ToList(); 

還要注意的是FirstOrDefault可以返回null,你應該檢查這一點。如果您知道它將(或應該)永遠不會是null,那麼請改爲使用First

+0

後,我更新的代碼,以顯示更多的那樣簡單。你是對的,那是問題所在。我正在做分頁,並沒有x.FirstService在選擇發生之前引用。 – user169867 2010-03-30 13:35:52

+0

@ user169867:您必須將分頁移動到最後。 – 2010-03-30 13:43:09

+0

如果這樣做了,分頁是否仍會在數據庫上發生,或者是否所有記錄都會返回並過濾? – user169867 2010-03-30 13:50:22