58

我有IQueryable<>对象。

List<>我想用选定的列将其转换为new { ID = s.ID, Name = s.Name }.

已编辑

马克你是绝对正确的!

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

它给了我整个对象IQueryable<>

而且我有严格的要求(为选择标签创建 json 对象)只有list<>两个字段的类型。

4

5 回答 5

78

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

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

于 2009-04-16T12:05:19.097 回答
48

添加以下内容:

using System.Linq

...并调用ToList().IQueryable<>

于 2009-04-16T12:19:32.497 回答
8

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

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

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

var list = new List<T>(queryable);
于 2013-05-23T14:35:47.200 回答
6

System.Linq 在 IQueryable<> 和 IEnumerable<> 上有 ToList()。但是,它将导致数据完全通过以将其放入列表中。当你这样做时,你会失去你的延迟调用。如果它是数据的消费者,这没什么大不了的。

于 2009-04-16T12:12:30.093 回答
2

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

这种方法的积极方面是:

  • 它几乎不需要使用任何代码 - 只需调用 .Transform <DtoType>()即可
  • 它就像 .Select(s=>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>();
}
于 2011-09-09T08:10:33.500 回答