Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将Linq动态查询结果强制转换为自定义类?_C#_Linq_Dynamicquery - Fatal编程技术网

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

C# 如何将Linq动态查询结果强制转换为自定义类?,c#,linq,dynamicquery,C#,Linq,Dynamicquery,通常,我会这样做: 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 =

通常,我会这样做:

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语句中投影类别?


我知道,在这两种情况下,g和它都是相同的,代表整个表记录,我把整个记录拉进去只是为了进行计数。我也需要解决这个问题。编辑:Marcelo Cantos指出Linq足够聪明,不会提取不必要的数据。谢谢

你为什么要这么做?由于GroupBy呼叫后您仍然拥有所有信息,因此您可以轻松地执行以下操作:

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

产品类型仍应流通并可访问,并且常规分组/筛选不应改变通过扩展方法流通的类型。

您是否验证了您实际上是在提取整个记录?我根本不知道动态LINQ,但我不明白为什么它不能像静态LINQ到SQL那样聪明。我认为Cantos关于它的拉动程度是正确的。如果动态查询的结果除了动态查询选择方法之外还有其他方法可用,我会感到惊讶,只需要一个字符串参数,而不是lambda。当然,除非我遗漏了一些明显的内容。换句话说,在.GroupBy()之后,唯一可用的选择是.select,它是动态查询版本(减去Lambda)。我在这样做时遇到的具体错误是“无法将Lambda表达式转换为'string'类型,因为它不是委托类型。我的代码是var a=Products.GroupBy。”(“ProductColor”,“it”)。选择(c=>new{name=((产品)c).ProductName});但是,如果我使用嵌套的foreach(a中的I组b){foreach(b中的产品c){//手动创建列表},那么这就很好了。它提取值并将它们设置在不同的内存变量中,但至少这是一种方法。如果您知道将a的值作为特定类型投影到单独的Linq查询中的方法,我很乐意将您的答案标记为绿色。