2017-09-26 53 views
1

我一直試圖得到一個IQueryable與不同的和有序的值,但我發現我不能申請一個獨特的orderby或我會失去秩序。IQueryable與不同的記錄和有序

我想最後的查詢是如下:

IQueryable<gbd_Pages> Listpagespages = 
     (from c in _db.gbd_Content 
     where c.IsActive == true && c.IsDeleted == false && 
      c.gbd_Template_Fields.SortOrder == sortOrder 
     orderby c.Content ascending 
     select c.gbd_Pages); 

有了這個,我得到重複的結果。

我要返回的表格是gbd_Pages,它與gbd_Content的關係爲1到很多。 這意味着gbd_Content將有一個外鍵,其主鍵爲gbd_Pages

我需要做一個sortOrder表gbd_Template_Fields與gbd_Content有一個關係1對1。

有沒有辦法讓我這樣做?我需要它是一個IQueryable而不轉換爲IEnumerable或列表。

+1

如果您正在尋找'gbp_Pages',那麼這需要成爲您的主要'from'。從那裏你可以在'gbd_Content'查詢中使用'.Any()',你不需要做一個Distinct。 – DiskJunky

+0

@DiskJunky你能給我舉一個例子怎麼做,最後我需要做一個sortOrder與c.gbd_Template_Fields.SortOrder – Nmaster88

+0

如果你有1對多的關係,你將如何訂購1的領域很多?它必須是一些集合,比如'Min'? –

回答

2

我相信你需要的是這樣的:

var query = 
    from p in _db.gbd_Pages 
    from pc in (from c in p.gbd_Content 
       where c.IsActive == true && c.IsDeleted == false && 
        c.gbd_Template_Fields.SortOrder == sortOrder 
       orderby c.Content ascending 
       select c).Take(1) 
    orderby pc.Content ascending 
    select p; 

所以,如果你的關係one身邊做起(避免Distinct需要),那麼你選擇一個記錄從many方匹配的標準和有sm (使用有序子查詢+ Take(1)),最後使用該單個子記錄中的排序字段值對結果進行排序。

我假設你有逆向收集導航屬性從gbd_Pagesgbd_Content。如果您不這樣做,請將p.gbd_Content替換爲_db.gbd_Content where c.[gbd_Content_FK] == p.[PK]

+0

這似乎是正確的解決方案。我只需要先做一些測試,並將其標記爲正確的解決方案。謝謝 – Nmaster88

1

您的主要from需要是gbd_Pages表,而不是gbp_Content如果這些是您想要返回的結果。我將不得不在這裏假設一個外鍵,但是你想要改變成類似的東西;

IQueryable<gbd_Pages> Listpagespages = _db.gbp_Pages 
              .Where(p => (from c in _db.gbd_Content 
                     where c.IsActive == true 
                      && c.IsDeleted == false 
                     select c.gbd_Pages.PrimaryKeyID) 
                     .Any()) 
              .Select(p => new 
                { 
                 // select specific fields here... 
                 p, 
                 SortCol = _db.gbp_Content 
                    .FirstOrDefault(c => c.PrimaryKeyID) 
                    .Where(c => c.IsActive == true && c.IsDeleted == false && 
                      c.gbd_Template_Fields.SortOrder == sortOrder) 
                    .Select(c => c.Content) 
                }) 
              .OrderBy(v => c.SortCol); 
+0

謝謝你的回答。 'gbd_Content'中的yes有一個來自'gbd_Pages'的外鍵,但是這樣做我怎麼能通過具有表gbd_Content的特定排序順序的content屬性來執行orderby? – Nmaster88

+0

它給我一個.Select錯誤:\t'bool'不包含'Select'的定義,並且沒有擴展方法'Select'接受類型'bool'的第一個參數可以被找到(你是否缺少using指令或裝配參考?) – Nmaster88

+0

@ Nmaster88更新後的查詢。在沒有模式/代碼的情況下動態執行有點困難,但調整應該有希望工作 – DiskJunky

-2

試試這個:

  IQueryable<gbd_Pages> Listpagespages = _db.gbd_Content 
               .Select (c=>new { c.gbd_Pages }) 
               .Where(c=>c.IsActive == true && c.IsDeleted == false &&c.gbd_Template_Fields.SortOrder == sortOrder) 
               .Distinct() 
               .OrderBy(c => c.Content) 
               .Select(c => c.gbd_Pages) 
+0

這種方法的問題在於不需要「Distinct()」。一般來說,使用不同的是從集合論的角度來看代碼的氣味,因爲它意味着你開始的數據太多了,或者你沒有選擇正確的集合作爲主要的 - 這就是這種情況。 – DiskJunky

+0

已經試過這個,不起作用,它可以給出重複的記錄 – Nmaster88