特定の列のみを取得

entity-framework

質問

実行したSQL内の特定の列のみをEFオブジェクトに取得させることはできますか?以下のコードを実行してオブジェクトを取得する場合、必要に応じて特定の列だけを取得するためにできることはありますか?

public IEnumerable<T> GetBy(Expression<Func<T, bool>> exp)
{
    return _ctx.CreateQuery<T>(typeof(T).Name).Where<T>(exp);
}

これにより、すべての列を含むselect句が生成されます。しかし、クエリを実際に遅くする大量のデータを含む列がある場合、オブジェクトを生成されたSQLからその列を除外するにはどうすればよいですか

テーブルにId(int)、Status(int)、Data(blob)がある場合、クエリをどのようにすることができますか

select Id, Status from TableName

の代わりに

select Id, Status, Data from TableName

以下の提案から、私の方法は

public IEnumerable<T> GetBy(Expression<Func<T, bool>> exp, Expression<Func<T, T>> columns)
{
    return Table.Where<T>(exp).Select<T, T>(columns);
}

そして私はそう呼んでいます

mgr.GetBy(f => f.Id < 10000, n => new {n.Id, n.Status});

ただし、コンパイルエラーが発生しました。

暗黙的にタイプ 'AnonymousType#1'を 'Entities.BatchRequest'に変換することはできません

受け入れられた回答

もちろんです。投影はこれを行います:

var q = from r in Context.TableName
        select new 
        {
            Id = r.Id,
            Status = r.Status
        }

これは実際の例です(明らかに、私のDBはあなたとは異なるテーブルを持っています)。私のEFモデルをLINQPadに追加して、次のクエリを入力しました。

from at in AddressTypes
select new
{
    Id = at.Id,
    Code = at.Code
}

LINQPadは、生成されたSQLが次のとおりであることを示しています。

SELECT 
    1 AS [C1], 
    [Extent1].[AddressTypeId] AS [AddressTypeId], 
    [Extent1].[Code] AS [Code]
FROM 
    [dbo].[AddressType] AS [Extent1]

テーブルの他のフィールドはすべて含まれていません。

更新された質問への回答

あなたのcolumns引数は型Tを取り、同じ型を返すと言っています。したがって、渡す式はこれに準拠する必要があります。または、引数の型を変更する必要があります。

public IEnumerable<U> GetBy<U>(Expression<Func<T, bool>> exp, Expression<Func<T, U>> columns)
{
    return Table.Where<T>(exp).Select<T, U>(columns);
}

これで式はあなたが使いたいと思うどんな型でも返すことができます。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ