LINQ选择表达式IEnumerable
本文关键字:IEnumerable 表达式 选择 LINQ | 更新日期: 2023-09-27 18:04:03
我正试图在LINQ
Select
中使用Expression
。这是我的代码的一个例子
Expression<Func<user, string>> expr = d => d.user.username;
Message.Select(b => new { name = b.user.Select(expr) });
消息类型为IEnumerable
,在运行时我收到以下错误:The exception message is ''System.Collections.Generic.List<W.Models.user>' does not contain a definition for 'Select'
我该如何解决这个问题?
听起来您的代码文件顶部缺少一个using System.Linq;
。不过,请注意,List<T>
是对对象的LINQ;丢失Expression
:
Func<user, string> expr = d => d.user.username;
Message.Select(b => new { name = b.user.Select(expr) });
最后的思考;虽然关于System.Collections.Generic.List<W.Models.user>
的消息建议使用列表,但您的代码(b.User.Select
/Message.Select
(建议使用单个对象。这是。。。令人困惑
请看一下为什么要使用表达式<Func<T>gt;而不是Func<T>?。
接受的答案描述Func<T>
是返回T
的方法的委托。然而,Expression<Func<T>>
实际上是对如何评估该委托的描述。例如,您可以将表达式编译为实际的委托:
Expression<Func<int, bool>> expr = i => i < 5;
Func<int, bool> deleg = expr.Compile();
Console.WriteLine("deleg(4) = {0}", deleg(4));
你甚至可以写:
Console.WriteLine("deleg(4) = {0}", expr.Compile()(4));
因此,如果您确实需要一个表达式,则需要将其编译为实际的委托,否则首先使用该委托。
(顺便说一句:您的代码示例不会编译,因为List<user>
没有采用表达式的Select
方法,而且d => d.user.username
可能是错误的。由于d
是user
,它应该是d => d.username
(。
但是linq-to实体不支持委托调用。因此,您必须通过添加AsEnumerable()
:切换到linq到对象
Expression<Func<user, string>> expr = d => d.username;
Func<user, string> func = expr.Compile();
var result = context.Message.AsEnumerable()
.Select(b => new { name = b.user.Select(func) });
使用linq-to实体访问数据、简单排序、过滤等。这样,它可以优化数据库的查询,但如果需要更多,可以切换到linq-to对象。
PS:lambda d => d.username
被编译成一个委托。如果显式地将其放入表达式b.user.Select(u => u.username)
中,它将正常工作,因为现在它还编译为linq-to实体可以在不调用委托的情况下处理的表达式。