转换IQueryable&lt;&gt;将对象键入List <t>类型?</t>

时间:2009-04-16 12:03:37

标签: c#

我有IQueryable&lt;&gt;对象

我想将其转换为List&lt;&gt;使用选定的列,例如new { ID = s.ID, Name = s.Name }

被修改

马克,你是对的!

但我只能访问FindByAll()方法(因为我的架构)。

它给了我IQueryable&lt;&gt;中的完整对象。

我有严格的要求(为select标签创建json对象)只有list&lt;&gt;输入两个字段。

5 个答案:

答案 0 :(得分:61)

然后只是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();

节省了一些电子......

答案 1 :(得分:40)

添加以下内容:

using System.Linq

...并在ToList()上致电IQueryable<>

答案 2 :(得分:8)

List类的构造函数可以为您转换IQueryable:

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

或者你可以在没有扩展方法的情况下转换它,当然:

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

答案 3 :(得分:6)

System.Linq在IQueryable&lt;&gt;上有ToList()和IEnumerable&lt;&gt ;.但是,它会导致完整的数据传递将其放入列表中。执行此操作时,您将失去延迟调用。如果它是数据的消费者,那就没什么大不了的了。

答案 4 :(得分:2)

这里有几种扩展方法,我陪同将IQueryables和IEnumerables从一种类型转换为另一种类型(即DTO)。它主要用于从较大的类型(即数据库中具有不需要的字段的行的类型)转换为较小的类型。

这种方法的积极方面是:

  • 它几乎不需要使用任何代码 - 只需简单调用.Transform <DtoType>()即可。
  • 它就像.Select(s =&gt; new {...}),即当与IQueryable一起使用时,它会产生最佳的SQL代码,排除DtoType没有的Type1字段。

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