あなたはAutoMapperが提供する柔軟性を必要としないか、サードパーティのライブラリを使用したくない場合は、以下の単純化されたカスタム拡張メソッドを使用することができますが:
public static class QueryableExtensions
{
public static IQueryable<TResult> SelectTo<TResult>(this IQueryable source)
{
var sourceType = source.ElementType;
var resultType = typeof(TResult);
var parameter = Expression.Parameter(sourceType, "x");
var bindings =
from rm in resultType.GetProperties().Concat<MemberInfo>(resultType.GetFields())
join sm in sourceType.GetProperties().Concat<MemberInfo>(sourceType.GetFields())
on rm.Name equals sm.Name
select Expression.Bind(rm, Expression.MakeMemberAccess(parameter, sm));
var body = Expression.MemberInit(Expression.New(resultType), bindings);
return source.Provider.CreateQuery<TResult>(Expression.Call(
typeof(Queryable), "Select", new[] { sourceType, resultType },
source.Expression, Expression.Quote(Expression.Lambda(body, parameter))));
}
}
これは、すべてを選択しようとします名前で一致するプロパティ/フィールド。一致するプロパティ/フィールドタイプが異なる場合は失敗します。
使用例:
メソッドの構文
var res = con.DataRepoes
.Where(rx => iaccess.Contains(rx.STOREID))
.SelectTo<Classes.DataResponse>()
.ToList();
クエリ構文
var res =
(from rx in con.DataRepoes
where iaccess.Contains(rx.STOREID)
select rx)
.SelectTo<Classes.DataResponse>()
.ToList();
たぶん[AutoMapper](http://automapper.org/)? –