1

我有一个特定的 LINQ 查询,它按匿名类型进行分组,然后通过投影选择对象。选择对象时,查询工作正常。我现在正在尝试更改查询的用法以进入包含投影到对象的所有属性的 DTO,但是当我将类型从 Object 切换到 DTO 时,查询开始给我一个错误,即IQueryable.Select 具有无效参数。

IQueryable<type> result = from o in blah where some_conditions
                          orderby o.Name
                          group o by new {o.Value1, o.Value2, o.Value3} into groupedO
                          select new type 
                          {
                               Value1=groupedO.Key.value1,
                               Value2=groupedO.Key.value2,
                               Value3=groupedO.Key.value3
                          }

当“类型”是我的原始对象时工作正常,但当我将其设为具有属性 Value1、Value2 和 Value3(适当类型)的 DTO 时会失败。

我意识到这可能不足以找到问题的信息,但我也接受任何关于寻找可能导致问题的方向的指示。我不知道可能有什么不同。此外,如果我删除组,查询工作正常,所以它是特定于组中的匿名类型的。

确切的错误是

System.Linq.IQueryable<System.Linq.IGrouping<AnonymousType#1,someDalClass>>' does not contain a definition for 'Select' and the best extension method overload 'System.Linq.Enumerable.Select<TSource,TResult>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TResult>)' has some invalid arguments.

4

3 回答 3

1

当您使用 GroupBy 时,结果是 IGroupable。所以你应该使用这样的东西:

IQueryable<type> result = from o in blah where some_conditions
                          orderby o.Name
                          group o by new {o.Value1, o.Value2, o.Value3} into groupedO
                          select new type 
                          {
                               Value1=groupedO.Key.value1,
                               Value2=groupedO.Key.value2,
                               Value3=groupedO.Key.value3
                          }

因为您的值 o.Value1、o.Value2、o.Value3 在 IGroupable 的键中。

于 2012-12-11T18:32:30.130 回答
1

为混乱道歉,但作为概念验证,以下在 LINQPad 中编译和运行。因此,使用匿名类型和分组都不是问题。

public class MyBlah
{
    public string Name;
    public int Value1;
    public int Value2;
    public int Value3;
}

public class MyDTO
{
    public int Value1;
    public int Value2;
    public int Value3;
}

void Main()
{
    MyBlah o1 = new MyBlah
    {
        Name = "asdf",
        Value1 = 2,
        Value2 = 3,
        Value3 = 4
    };

    MyBlah o2 = new MyBlah
    {
        Name = "fdsa",
        Value1 = 3,
        Value2 = 4,
        Value3 = 5
    };

    MyBlah o3 = new MyBlah
    {
        Name = "HI",
        Value1 = 3,
        Value2 = 4,
        Value3 = 5
    };

    List<MyBlah> lst = new List<MyBlah>();
    lst.Add(o1);
    lst.Add(o2);
    lst.Add(o3);

    IEnumerable<MyBlah> result = from o in lst
                                 orderby o.Name
                                 group o by new {o.Value1, o.Value2, o.Value3} into groupedO
                                 select new MyBlah
                                 {
                                     Value1 = groupedO.Key.Value1,
                                     Value2 = groupedO.Key.Value2,
                                     Value3 = groupedO.Key.Value3
                                 };

    IEnumerable<MyDTO> resultDTO = from o in lst
                                   orderby o.Name
                                   group o by new {o.Value1, o.Value2, o.Value3} into groupedO
                                   select new MyDTO
                                   {
                                       Value1 = groupedO.Key.Value1,
                                       Value2 = groupedO.Key.Value2,
                                       Value3 = groupedO.Key.Value3
                                   };
}
于 2012-12-11T18:45:01.723 回答
0

掌心时刻。问题是 DTO 在字段名称中有拼写错误并且没有编译,但是它在错误日志中丢失了。修复 DTO 中的错字使类型正确匹配,现在一切正常。谢谢。

于 2012-12-11T18:48:22.423 回答