2015-06-04 86 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()