根据类别从列表中获取记录

时间:2015-06-04 06:08:43

标签: c# linq linq-to-sql

查询:

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();

这些包得到6个结果如下(突出显示的那些):

enter image description here

我想要一个从每个类别返回一个项目的查询 例如,我想要记录K1503,T1503

我想要以 K 开头的第一条记录以及以 T 开头的第一条记录

我尝试了以下内容:

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,请提供任何帮助。

2 个答案:

答案 0 :(得分: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();

抱歉,我的查询采用简明表示法,而不是您的查询表示法。

答案 1 :(得分: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()