c#如何在不通过每个字段的情况下创建自定义对象的集合

时间:2016-07-21 18:12:00

标签: c# linq collections

我创建了一个名为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>();

3 个答案:

答案 0 :(得分:2)

您可以使用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();                                    

答案 1 :(得分:1)

使用LINQ无法做到这一点。 但是,您可以使用“AutoMapper”来实现此目的。 只需为这两个类创建CreateMap,然后映射它们

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>();

希望有所帮助!!

答案 2 :(得分:1)

如果您不需要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();