1

C# でモジュラー プログラミングを使用したいと考えています。Linq クエリでメソッドを作成しようとしました。私の知る限り、Linq クエリを実行するには変数に格納する必要があります。という名前のクラスとメソッドを作成しましたSearchStudent()が、Linq クエリを返す方法がわかりません。私は何をすべきか?

public var SearchStudent(string ogrenci_id)
{
    var query =
         from d in context.ogrencis
         where d.ogrenci_id ==Convert.ToInt32(ogrenci_id)
         select new
         {
             d.ogrenci_adi,
             d.ogrenci_soyadi
         };

    return query;
}
4

6 に答える 6

11

varメソッドのスコープ内でのみ有効であるため、残念ながらそれは不可能です。戻り値の型は明示的な型である必要があります。

解決策は、匿名型を使用する代わりに、クエリ結果を格納するためのクラスを作成することです。

于 2013-06-18T12:45:49.960 に答える
4

この世界のすべての小さな子猫の愛のために、具体的なタイプを作成していただけませんか? はい、定型文ですが、簡単です。匿名型のシーケンスを渡すよりも、ソリューションを無限に保守しやすくします (はい、それはオプションです。実行しないでください)。

class QueryResult {
    public int Orgrenci_adi { get; private set; }
    public int Orgrenci_soyadi { get; private set; }

    public QueryResult(int orgrenci_adi, int orgrenci_soyadi) {
        this.Orgrenci_adi = orgrenci_adi;
        this.Orgrenci_soyadi = orgrenci_soyadi;
    }
}

public IEnumerable<QueryResult> SearchStudent(string ogrenci_id) {
    return
        from d in context.ogrencis
        where d.ogrenci_id == Convert.ToInt32(ogrenci_id)
        select new QueryResult(d.ogrenci_adi, d.ogrenci_soyadi);
}

var戻り値の型として使用することはできません。varコンパイラに、ほら、あなたは自分のことをして、型が何であるか理解します。コンパイラで戻り値の型を実装する複雑さを想像できますか? ネストされたメソッドの任意の長さのチェーンがすべて戻り値の型ですべて呼び出されていると想像してくださいvar。コンパイラは、型が何であるかを解決するために多くの作業を行う必要があります。それよりも実装する価値のある機能があります

于 2013-06-18T12:53:36.287 に答える
1

動的を使用できますが、それが良い考えかどうかはわかりません。

public dynamic SearchStudent(string ogrenci_id)
{
  var query =
     from d in context.ogrencis
     where d.ogrenci_id ==Convert.ToInt32(ogrenci_id)
     select new
     {
         d.ogrenci_adi,
         d.ogrenci_soyadi
     };

    return query;

}
于 2013-06-18T12:47:34.340 に答える
1

Theyvarキーワードは、コンパイル中に実際の型に置き換えられvarます。それ自体は型ではないため、返すことはできません。

あなたの場合、あなたは をやっていてprojection、 を得るanonymous typeanonymous typesメソッドから戻ることはできません。唯一のオプションは、クラスを作成してそれを返すことです。

class MyClass { .. }

var query =
     from d in context.ogrencis
     where d.ogrenci_id ==Convert.ToInt32(ogrenci_id)
     select MyClass new
     {
         d.ogrenci_adi,
         d.ogrenci_soyadi
     };

    return query;
于 2013-06-18T12:46:36.703 に答える
1

あなたのタイプはIEnumerable<T>匿名Tタイプです。匿名であるため、匿名型を静的に定義することはできません。

次の 2 つの解決策があります。

  1. IEnumerableメソッドの戻り値の型として使用:

    public IEnumerable SearchStudent(string o)
    
  2. 自分でクラスを定義する

    public class Result
    {
        public int Adi { get; set; }
    
        public int Soy { get; set; }
    }
    
    public IEnumerable<Result> SearchStudent(string o)
    {
        return
            from d in context.ogrencis
            where d.ogrenci_id    
            select new Result
            {
                Adi = d.ogrenci_adi,
                Soy = d.ogrenci_soyadi
            };
    }
    
于 2013-06-18T12:46:55.907 に答える
0

あなたの場合、次のコードを使用する必要があります

public SearchStudent(string ogrenci_id)
{
  var query =
     from d in context.ogrencis
     where d.ogrenci_id ==Convert.ToInt32(ogrenci_id)
     select new
     {
         d.ogrenci_adi,
         d.ogrenci_soyadi
     };

    return query;
}

それが動作します。

于 2013-06-18T12:52:55.977 に答える