![](/img/trans.png)
[英]How can I create a collection with a sequential number as one field from another collection in C#
[英]c# How can I create a collection of custom objects without going through each field
我创建了一个名为DataResponse
的类,该类具有40多个公共字段。 类DataResponse
具有与我的数据库DataRepoes
的字段和类型相同的字段数和类型(假设是这样)。
有什么办法可以像linq一样在下面创建对象列表并自动从数据库中的字段中将字段分配给DataResponse
的方式? 否则,我必须拼写出这40个字段中的每个字段,并在新建DataResponse类时手动分配它们。 谢谢
List<Classes.DataResponse> res = (from rx in con.DataRepoes
where iaccess.Contains(rx.STOREID)
select new Classes.DataResponse).ToList<Classes.DataResponse>();
您可以为此使用Automapper Queryable Extensions 。
假设Classes.DataResponse
的字段与DataRepoes
的字段具有相同的名称,然后执行以下操作:
// During your application bootstrap, configure AutoMapper to create a map between the two types
Mapper.Initialize(cfg => cfg.CreateMap<DataRepoes, Classes.DataResponse);
// Then you can ask AutoMapper to project the IQueryable directly to your DTO
List<Classes.DataResponse> res = con.DataRepoes
.Where(rx => iaccess.Contains(rx.STOREID))
.ProjectTo<Classes.DataResponse>()
.ToList();
使用LINQ是不可能的。 但是,您可以使用“ AutoMapper ”来实现。 只需为这两个类创建Map,然后将其映射
Mapper.CreateMap<DataResponse,DataRepo>();//Assuming DataRepoes is collection of DataRepo types
List<Classes.DataResponse> res = (from rx in con.DataRepoes
where iaccess.Contains(rx.STOREID)
select Mapper.Map<Classes.DataResponse>(rx)).
ToList<Classes.DataResponse>();
希望有帮助!!
如果您不需要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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.