3

私はこのような関数呼び出しを持っているかもしれません:

foo(**new {x.ID,x.Name}**);

およびLINQ

(IQueryable<SomeTableName>).where(x=>x.ID>1).select(x=>**new {x.ID,x.Name}**);

その部分を関数、式、または変数に置き換えて、"new {x.ID,x.Name}"1 か所だけで随時変更できるようにすることはできますか? ありがとうございました。

LINQ 内でのみ使用される式を作成できることを知っています

public static Func<SomeTableName, Object> Select_RS_Food = x => new { x.ID,x.Name };

しかし、通常の匿名オブジェクトの作成にも使用したいと考えています。お気に入り:

foo(CreateMyObject(x));

アップデート

現時点の:

return new { myTable.ID, myTable.Name};
//And
db.SomeTable.Select (x=> new { myTable.ID, myTable.Name));

予想:

return SomeMagicCode;
//And
db.SomeTable.Select (x=> SomeMagicCode);
4

1 に答える 1

3

次のようなヘルパー クラスを定義して、次の作成時にジェネリック型パラメーターの一部のみを指定できるようにすることができますFunc<T, R>

public static class Funk<T>
{
    public static Func<T, R> Make<R>(Func<T, R> func)
    {
        return func;
    }
}

そして、次のように使用します。

var selector = Funk<SomeTableName>.Make(x => new {x.ID, x.Name});
var result = db.SomeTable.Where(x => x.ID>1).Select(selector);

これは型推論を利用して戻り値の型を決定するため、入力型 ( SomeTableName) を定義するだけで済みます。varキーワードは、変数selectorを暗黙的に型指定します。指定する必要はありませんFunc<SomeTableName, _AnonymousType1_>selector複数のクエリで再利用できるようになりました。

ただし、型メンバーでは暗黙の型指定がサポートされていないため、これをクラスのプロパティまたはフィールドとして保存することはできません。この選択関数を再利用できるようにしたい場合は、名前付きの型を使用する必要がありますが、dynamicこれが現在の ORM で機能するとは思えません。

他のラムダ式 (x => x.ID == 1およびx => x.ID > 1) については、関与する匿名型がないため、次のように簡単に実行できます。

public static Func<SomeTableName, bool> IDEquals1 = x => x.ID == 1;
public static Func<SomeTableName, bool> IDGreaterThan1 = x => x.ID == 1;

ただし、ORM のようなエンティティ フレームワークを使用している場合は、おそらくExpression代わりに を使用する必要があります。たぶん、次のようなものです:

public static Expression<Func<T, bool>> IDEquals1 = x => x.ID == 1;

またはこれでも:

public interface IHasID 
{
    int ID { get; }
}

public SomeTableName : IHasID { ... }

public static Expression<Func<T, bool>> IDEquals1<T>() where T : IHasID
{
     return x => x.ID == 1;
}
于 2013-06-28T17:05:02.590 に答える