为什么IQueryable Select具有无效的参数与DTO但与对象一起使用?

时间:2012-12-11 18:03:13

标签: c# linq

我有一个特定的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
                          }

当“type”是我的原始对象时工作正常但是当我将其设为具有属性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.

3 个答案:

答案 0 :(得分: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的Key中。

答案 1 :(得分: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
                                   };
}

答案 2 :(得分:0)

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