通过linq查询过滤组

时间:2016-09-22 09:08:06

标签: c# asp.net linq

 var testingAll =          (from ac in metaData.AcTable
                            where ac.Call >= DateTime.Now.AddMonths(-2) && ac.Call  <= DateTime.Now 
                            group adminCall by ac.LanguageCode into acc
                            select new { lang = acc.Key, count = acc.Count() }).ToDictionary(x => x.lang, y => y.count).OrderByDescending(x => x.Key);

我可以在日期时间后再次过滤吗?

这样的事情:

var Today = testingAll.Where( /*x => x.Call >= DateTime.Now.AddDays(-2)*/) 

2 个答案:

答案 0 :(得分:1)

我想你想要像

这样的东西
var testingAll =          (from ac in metaData.AcTable
                            where ac.Call >= DateTime.Now.AddMonths(-2) && ac.Call  <= DateTime.Now 
                            group adminCall by adminCall.LanguageCode into ac
                            select ac

这应该会给你一个集合,然后你可以多次查询。

答案 1 :(得分:0)

简短的回答是,你不能这样做。想一想这个问题,这个问题实际上与我给你一个班级中孩子的平均年龄相同,然后你拿这个数字并试图计算出男孩的平均年龄 - 这是不可能的没有源数据。

现在你可以通过构建表达式并在那里花费大量精力来,但它仍然需要重新查询数据库。

如果你真的想稍微抽象一下,那么你可以创建一个将where谓词作为参数的函数:

public IEnumerable<KeyValuePair<string, int>> GetFilteredCalls(
    Expression<Func<Call, bool>> predicate)
{
    return calls
        .Where(predicate)
        .GroupBy(c => c.LanguageCode)
        .Select(g => new { Lang = g.Key, Count = g.Count() })
        .ToDictionary(x => x.Lang, y => y.Count)
        .OrderByDescending(x => x.Key);
}

你这样使用它:

var calls = GetFilteredCalls(c => c.Call >= DateTime.Now.AddMonths(-2) 
                                  && c.Call <= DateTime.Now);

var moreCalls = GetFilteredCalls(c => c.Call >= DateTime.Now.AddDays(-2) 
                                  && c.Call <= DateTime.Now);