1

匿名型でグループを作成し、プロジェクションを介してオブジェクトを選択する特定の LINQ クエリがあります。オブジェクトを選択すると、クエリは正常に機能します。オブジェクトに投影されるすべてのプロパティを含む DTO に入るクエリの使用法を変更しようとしていますが、型をオブジェクトから 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

混乱をお詫びしますが、概念実証と同様に、以下は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 に答える
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 に答える
0

フェイスパームの瞬間。問題は、DTO のフィールド名にタイプミスがあり、コンパイルされていないことでしたが、エラー ログでは失われていました。DTO のタイプミスを修正すると、型が適切に一致し、すべてが正常になりました。ありがとう。

于 2012-12-11T18:48:22.423 に答える