0

テーブル 1 から個別のコード セットを取得し、コード フィールドに基づいてテーブル 2 からすべてのレコードを除外します。エレガントでクリーンなコードになるため、LINQ と匿名型の利点を利用したいと考えており、中間トランスポート クラスを作成しないようにしています。コードは次のようになります。

//In db repository
public static IQueryable DataQuery()
{
    var args = db.Table1.Select(x => new { x.Code }).Distinct();
    return db.Table2.Where(r => args.Contains(r.Code));
    // Contains extension not allow use args implicitly!
}

メソッドの呼び出し:

public void GetData()
{
     var data = Repository.DataQuery(); 
     var result = data.Select(d => new 
        {
            Value = d.Code,
            Text = d.Name
        });
 // the same problem here, Select wants only explicitly specified args!
}

どうすれば適切な方法で、できるだけきれいに行うことができますか? 主に、コード例には 2 つの問題があります。同じメソッドで匿名を引数として取り、それを別のメソッド/プロジェクトに返します。では、使用できない場合、匿名の使用は何ですか? すべてのチュートリアルで、anonymous が Console.WriteLine(...) として使用されていることがわかりますが、もちろん機能しますが、実際には画面に表示されるものがもっと欲しいです。

大きなテーブルから異なるエンティティ サブセットを除外したい場合、新しいクラスを作成する唯一の方法ですか?

既知の制限:
匿名は周囲のスコープでのみ使用できます。
動的は同じアセンブリでのみ役立ちます。

編集例:

public IQueryable DataQuery()
{
    return dbContext.MyModel.Select(x => new { x.Code, x.Name }).Distinct();
}

MyModel 内の特定のプロパティに対してのみ、Iqueryable または ienumerable を返したいと考えています。

4

1 に答える 1

1

私が見ることができる問題:

  1. x.Code不要なクラスをラップします。選択するだけです。
  2. 戻る必要がありますIQueryable<T>
public static IQueryable<T> DataQuery()
{
    //var args = db.Table1.Select(x => new { x.Code }).Distinct();
    var args = db.Table1.Select(x =>  x.Code ).Distinct();
    return db.Table2.Where(r => args.Contains(r.Code));
}

これを呼び出すときは、タイプを指定する必要があります

public void GetData()
{
     var data = Repository.DataQuery<Table2Type>(); 
     var result = data.Select(d => new 
        {
            Value = d.Code,
            Text = d.Name
        });     
}

匿名型は周囲のスコープでのみ使用でき、メソッドから返すことはできません。

于 2013-10-19T11:12:33.427 に答える