如何将 Linq 动态查询结果转换为自定义类?

6

通常,我会这样做:

var a = from   p in db.Products
        where  p.ProductType == "Tee Shirt"
        group  p by p.ProductColor into g
        select new Category { 
               PropertyType = g.Key,
               Count = g.Count() }

但是我有这样的代码:
var a = Products
        .Where("ProductType == @0", "Tee Shirt")
        .GroupBy("ProductColor", "it")
        .Select("new ( Key, it.Count() as int )");

我该如何更改语法以产生相同的结果,即如何从第二个Linq语句中投影Category?我知道在这两个语句中,g和it是相同的,并且代表整个表记录,而我只是为了计数而提取整个记录。我也需要解决这个问题。编辑:Marcelo Cantos指出,Linq足够聪明,不会提取不必要的数据。谢谢!

1
你确定你实际上正在提取整个记录吗?我完全不了解动态LINQ,但我不明白为什么它不能像静态的LINQ-to-SQL一样聪明处理这个问题。 - Marcelo Cantos
我认为Cantos关于它的拉力是正确的。 - Zachary Scott
1个回答

2

为什么你还需要做这个呢?既然你在GroupBy调用之后仍然拥有了所有的信息,你可以很容易地执行以下操作:

var a = Products
        .Where("ProductType == @0", "Tee Shirt")
        .GroupBy("ProductColor", "it")
        .Select(c => new Category { 
            PropertyType = g.Key, Count = g.Count() 
        });

产品类型应该仍然流经并可被访问,常规的分组/过滤不应该改变通过扩展方法传递的类型。

1
如果动态查询的结果除了一个只接受字符串参数而不是lambda表达式的动态查询选择方法之外,我会感到惊讶。当然,除非我漏掉了什么显而易见的东西。 - Zachary Scott
换句话说,在.GroupBy()之后,唯一可用的选择是.Select,它是动态查询版本(减去Lambda)。 - Zachary Scott
1
我在这样做时遇到的具体错误是“无法将lambda表达式转换为类型'string',因为它不是委托类型。我的代码是var a = Products.GroupBy("ProductColor", "it").Select(c => new { name = ((Products)c).ProductName });但是,如果我使用嵌套的foreach( IGrouping<string,Products> b in a) { foreach ( Products c in b ) { // create a List manually }},那么这个方法就可以很好地工作了。它会提取值并将其设置在不同的内存变量中,但至少这是一种方法。 - Zachary Scott
如果您知道一种将a的值作为特定类型在单独的Linq查询中投影的方法,我将很乐意将您的答案标记为正确。 - Zachary Scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接