web-dev-qa-db-ja.com

IQueryable <>型オブジェクトをList <T>型に変換しますか?

_IQueryable<>_オブジェクトがあります。

_List<>_のような選択した列を使用して、それを_new { ID = s.ID, Name = s.Name }_に変換します。

編集済み

マークはあなたが絶対に正しいです!

しかし、私はFindByAll() Methodにしかアクセスできません(私のアーキテクチャのため)。

そして、_IQueryable<>_でオブジェクト全体を提供します

また、2つのフィールドを持つ_list<>_タイプのみを持つという厳しい要件(selectタグのjsonオブジェクトの作成)があります。

47
Vikas

それからちょうどSelect

var list = source.Select(s=>new { ID = s.ID, Name = s.Name }).ToList();

(編集)実際には-この場合、名前は推測される可能性があるため、以下を使用できます。

var list = source.Select(s=>new { s.ID, s.Name }).ToList();

いくつかの電子を節約します...

64
Marc Gravell

以下を追加します。

_using System.Linq
_

...そして_IQueryable<>_でToList()を呼び出します。

41
Hannoun Yassir

Listクラスのコンストラクターは、IQueryableを変換できます。

public static List<TResult> ToList<TResult>(this IQueryable source)
{
    return new List<TResult>(source);
}

または、もちろん拡張メソッドなしで変換することができます:

var list = new List<T>(queryable);
8
mmmeff

System.Linqには、IQueryable <>およびIEnumerable <>にToList()があります。ただし、データを完全に通過させてリストに入れます。これを行うと、遅延呼び出しを失います。データの消費者であれば大したことではありません。

6
Brian Genisio

IQueryablesとIEnumerablesをあるタイプから別のタイプ(つまりDTO)に変換するために一緒に審査した2つの拡張メソッドを次に示します。主に、より大きな型(つまり、不要なフィールドがあるデータベース内の行の型)からより小さな型に変換するために使用されます。

このアプローチの利点は次のとおりです。

  • 使用するコードはほとんど必要ありません-.Transform<DtoType>() は、あなたが必要とすることすべてです
  • select(s => new {...})と同じように機能します。つまり、IQueryableと共に使用すると、DtoTypeにはないType1フィールドを除き、最適なSQLコードが生成されます。

LinqHelper.cs:

public static IQueryable<TResult> Transform<TResult>(this IQueryable source)
{
    var resultType = typeof(TResult);
    var resultProperties = resultType.GetProperties().Where(p => p.CanWrite);

    ParameterExpression s = Expression.Parameter(source.ElementType, "s");

    var memberBindings =
        resultProperties.Select(p =>
            Expression.Bind(typeof(TResult).GetMember(p.Name)[0], Expression.Property(s, p.Name))).OfType<MemberBinding>();

    Expression memberInit = Expression.MemberInit(
        Expression.New(typeof(TResult)),
        memberBindings
        );

    var memberInitLambda = Expression.Lambda(memberInit, s);

    var typeArgs = new[]
        {
            source.ElementType, 
            memberInit.Type
        };

    var mc = Expression.Call(typeof(Queryable), "Select", typeArgs, source.Expression, memberInitLambda);

    var query = source.Provider.CreateQuery<TResult>(mc);

    return query;
}

public static IEnumerable<TResult> Transform<TResult>(this IEnumerable source)
{
    return source.AsQueryable().Transform<TResult>();
}
2
Vedran