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