2015-06-04 65 views
1

查詢:從列表中得到記錄類別

List<vwBookTitleKitsSummary> theseKits = (from k in _dataContext.vwBookTitleKitsSummaries 
                 where k.DateKitEnds > DateTime.Now && k.DateKitStarts <= DateTime.Now && k.IsDeleted == false 
                 orderby k.KitOrder, k.KitCode descending 
                 select k).ToList(); 

thesekits有像6周的結果如下(高亮顯示的):

enter image description here

我想,從返回一個項目查詢每個類別 例如我想要記錄K1503,T1503

我想,隨着ķ和第一條記錄與牛逼開始啓動第一個記錄

我試着像以下:

List<vwBookTitleKitsSummary> theseKits = (from k in _dataContext.vwBookTitleKitsSummaries 
                 where k.DateKitEnds > DateTime.Now && k.DateKitStarts <= DateTime.Now && k.IsDeleted == false && (k.KitCode.StartsWith("K")) 
                 orderby k.KitOrder, k.KitCode descending 
                 select k).Take(1).ToList(); 

List<vwBookTitleKitsSummary> qry = (from k in _dataContext.vwBookTitleKitsSummaries 
          where k.DateKitEnds > DateTime.Now && k.DateKitStarts <= DateTime.Now && k.IsDeleted == false && (k.KitCode.StartsWith("T")) 
          orderby k.KitOrder, k.KitCode descending 
          select k).Take(1).ToList(); 
theseKits.AddRange(qry); 

這將返回記錄與KitCode - K1503,T1503

而不是編寫兩個查詢和使用AddRange可以在一個查詢中完成,請任何幫助。

+0

嘗試在第一個查詢中添加OR條件 –

+0

用K1503,K1502添加(k.KitCode.StartsWith(「K」)|| k.KitCode.StartsWith(「T」)來自每個KitCode – user1282609

回答

2

這應該會爲您的類別中的所有首字母提供1個記錄。

List<vwBookTitleKitsSummary> firstCategoryTheseKits = _dataContext 
    .vwBookTitleKitsSummaries.Where(k => k.DateKitEnds > DateTime.Now 
     && k.DateKitStarts <= DateTime.Now && k.IsDeleted == false).OrderBy(k => k.KitOrder) 
    .ThenByDescending(k => k.KitCode).GroupBy(k => k.KitCode[0]).Select(grps => grps.First) 
    .ToList(); 

如果你只是想爲T或K,你可以添加一個WHERE條件如下:

List<vwBookTitleKitsSummary> firstCategoryTheseKits = _dataContext 
    .vwBookTitleKitsSummaries.Where(k => k.DateKitEnds > DateTime.Now 
    && k.DateKitStarts <= DateTime.Now && k.IsDeleted == false 
    && (k.KitCode[0] == 'T' || k.KitCode[0] == 'K')).OrderBy(k => k.KitOrder) 
    .ThenByDescending(k => k.KitCode).GroupBy(k => k.KitCode[0]) 
    .Select(grps => grps.First).ToList(); 

對不起我的查詢是簡潔的符號,而不是你的查詢符號。

+0

第一個工作,謝謝,但是如果我想跳過每個類別中的第一個?例如,我想要一切,但不是T1503,K1503在上述6個結果中請。 – user1282609

+1

在這種情況下,您可以添加此檢查,它基本上只選擇超過1條記錄的組並跳過第一條記錄:GroupBy(k => k.KitCode [0])。其中(grps => grps.Count()> 1).Select(grps = > grps.Skip(1).First()) –

+0

它給出了每個類別的第二條記錄,例如我想排除T1503,K1503,但是我想T1502,T1501,K1502,K1501。grps.Skip(1).First ()總是返回一個,我想要類似grps.Skip(1).All(),請幫忙。 – user1282609

1

您可以按第一個字符組,採取各組的第一個項目:

from k in _dataContext.vwBookTitleKitsSummaries 
where k.DateKitEnds > DateTime.Now && k.DateKitStarts <= DateTime.Now 
    && k.IsDeleted == false 
orderby k.KitOrder, k.KitCode descending 
group k by k.KitCode.SubString(0,1) into grp 
select new { grp.Key, k = grp.FirstOrDefault() } 

或者,如果你只是喜歡select grp.FirstOrDefault()