5

linq to sql メソッドがあり、クエリを実行すると、匿名型が返されます。

その匿名型をサービス層に戻して、ロジックや処理を実行したいと考えています。

どうやって返せばいいのかわからないけど。

これならいけると思った

public List<T> thisIsAtest()
{
     return query;
}

しかし、私はこのエラーが発生します

Error   1   The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)

したがって、どのアセンブリが欠落しているか、またはそうであるかどうかはわかりません。

ありがとう

編集

最初の問題は解決しましたが、匿名型についてあまり知らないため、修正方法がわからないという新しい問題が発生しました。

このエラーが発生します

タイプ 'System.Collections.Generic.List' を 'System.Collections.Generic.List' に暗黙的に変換することはできません

ここにクエリがあります

   DbContext.Table.Where(u => u.Table.UserId == userId && u.OutOFF != 0)
       .GroupBy(u => new { u.Table.Prefix })
       .Select(group => new { prefix = group.Key, 
                              Marks = group.Sum(item => (item.Mark * item.Weight) / item.OutOFF) })
       .ToList();

編集 2

public class ReturnValue
{
   string prefix { get; set; }
   decimal? Marks { get; set; } 
}

public List<ReturnValue> MyTest(Guid userId)
{
   try
   {
       var result = dbContext.Table.Where(u => u.Table.UserId == userId && u.OutOFF != 0).GroupBy(u => new { u.Table.Prefix })
       .Select(group => new { prefix = group.Key, Marks = group.Sum(item => (item.Mark * item.Weight) / item.OutOFF) }).ToList();
       return result;
   }
   catch (SqlException)
   {
       throw;
   }

選択にはこれが含まれています

Anonymous Types:

a is new{string Prefix}
b is new{ 'a prefix, decimal? marks}
4

5 に答える 5

12
public List<T> thisIsAtest<T>()
{
     return query;
}
于 2009-12-20T22:26:36.027 に答える
8

できません-期間。独自のスコープ外で匿名型を使用することはできません。たとえば、メソッドからの戻り値としてそれらを返すことはできません

それらを返す必要がある場合は、匿名型の代わりに新しい具象クラスを定義し、それを匿名型の代わりに使用する必要があります。

匿名型のスコープに関するRick Strahl のブログ投稿を参照してください。また、 MSDN のドキュメントを参照してください。

匿名型にはメソッド スコープがあります。匿名型、または匿名型を含むコレクションをメソッド境界の外に渡すには、まず型をオブジェクトにキャストする必要があります。 ただし、これは匿名型の強力な型指定を無効にします。クエリ結果を格納するか、メソッド境界の外に渡す必要がある場合は、匿名型ではなく、通常の名前付き構造体またはクラスを使用することを検討してください。

OK、確かに-匿名型を実際に返すための汚いひどいハックがあります。しかし、もし Microsoft の MSDNJon Skeet がその慣行を思いとどまらせているのなら、それをしないでください。定義と意図により、匿名型は定義されているメソッドにバインドされます。

chobo2の更新:あなたのデータ型が何であるかはわかりません-推測だけです-しかし、「プレフィックス」がintで「マーク」が小数であると仮定すると、新しいクラスを定義できます:

public class ReturnValue
{
    int prefix { get; set; }
    decimal Marks { get; set; } 
}  

そして、あなたのコードは以下を返すメソッドになりますList<ReturnValue>:

public List<ReturnValue> thisIsAtest()
{
   DbContext.Table.Where(u => u.Table.UserId == userId && u.OutOFF != 0)
     .GroupBy(u => new { u.Table.Prefix })
     .Select(group => new ReturnValue 
                          { prefix = group.Key, 
                            Marks = group
                              .Sum(item => (item.Mark * item.Weight) / item.OutOFF) })
     .ToList();
}

ここで重要なのは、.Selectメソッドで、匿名型の新しいインスタンスを作成する代わりに、次のようにします。

     .Select(group => new { prefix = group.Key, marks = .... }

具体的な型のインスタンスを作成します。

     .Select(group => new ReturnValue { prefix = group.Key, marks = .... }

このようにして、具体的なクラスReturnValue(好きな名前を付けます) ができ、その型のリストを簡単に返すことができ、その型を他の場所でも使用できます。

于 2009-12-20T22:27:21.797 に答える
3

通常のメソッドから匿名型を返したいですか? リフレクションを使えばできると確信していますが、タイプ セーフはなく、その他にもさまざまな問題があります。言うまでもなく、呼び出しコードの観点からは奇妙に見えます。基本的にオブジェクトを返す必要があると思います。

クラスまたは構造体を使用して、そこに値を詰め込むことをお勧めします。

于 2009-12-20T22:29:05.890 に答える
0

匿名型は非常に制限されており、宣言されているメソッドのスコープ内でのみ使用できます。

それらをプレーン オブジェクトとして返すことはできますが、型情報は失われます。匿名型を渡すいくつかのソリューションを見てきました。ただし、後でリフレクションを使用してプロパティを取得します。

于 2009-12-20T22:29:33.353 に答える
0

ジェネリック リストをグローバル変数として宣言する場合は、return を使用する必要はありません。とにかく、marc_sができないと言ったという理由だけで、コードでreturn関数を使用しました。笑

 public static class Globals
    {
        public static List<string> CurPart = new List<string>();
    }
    public List<string> MSQueryRead1DArray(string sql, string db)
    {
        return Globals.CurPart;
    }
于 2020-06-03T20:01:07.780 に答える