_IQueryable<>
_オブジェクトがあります。
_List<>
_のような選択した列を使用して、それを_new { ID = s.ID, Name = s.Name }
_に変換します。
編集済み
マークはあなたが絶対に正しいです!
しかし、私はFindByAll()
Methodにしかアクセスできません(私のアーキテクチャのため)。
そして、_IQueryable<>
_でオブジェクト全体を提供します
また、2つのフィールドを持つ_list<>
_タイプのみを持つという厳しい要件(selectタグのjsonオブジェクトの作成)があります。
それからちょうど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();
いくつかの電子を節約します...
以下を追加します。
_using System.Linq
_
...そして_IQueryable<>
_でToList()
を呼び出します。
Listクラスのコンストラクターは、IQueryableを変換できます。
public static List<TResult> ToList<TResult>(this IQueryable source)
{
return new List<TResult>(source);
}
または、もちろん拡張メソッドなしで変換することができます:
var list = new List<T>(queryable);
System.Linqには、IQueryable <>およびIEnumerable <>にToList()があります。ただし、データを完全に通過させてリストに入れます。これを行うと、遅延呼び出しを失います。データの消費者であれば大したことではありません。
IQueryablesとIEnumerablesをあるタイプから別のタイプ(つまりDTO)に変換するために一緒に審査した2つの拡張メソッドを次に示します。主に、より大きな型(つまり、不要なフィールドがあるデータベース内の行の型)からより小さな型に変換するために使用されます。
このアプローチの利点は次のとおりです。
<DtoType>
() は、あなたが必要とすることすべてです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>();
}