将IQueryable <>types的对象转换为List <T>types?

我有IQueryable <>对象。

我想将它转换成列表<>与选定的列像new { ID = s.ID, Name = s.Name }

编辑

马克你是绝对正确的!

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

它在IQueryable <>中给了我完整的对象。

我有严格的要求(用于创buildjson对象的select标签)只有列表<>types与两个字段。

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

这节省了一些电子…

使用System.Linq添加并调用IQueryable <>上的ToList()

System.Linq在IQueryable <>和IEnumerable <>上有ToList()。 尽pipe如此,这将导致数据的全部通过。 当你这样做的时候,你放弃了延迟调用。 如果它是数据的消费者,则不是什么大问题。

List类的构造函数可以为你转换一个IQueryable:

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

或者你可以直接转换它,当然不用扩展方法:

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

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

这种方法的积极方面是:

  • 它几乎不需要代码就可以使用 – 只需调用<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>(); }