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'

我该如何解决这个问题?

LINQ选择表达式IEnumerable

听起来您的代码文件顶部缺少一个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可能是错误的。由于duser,它应该是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实体可以在不调用委托的情况下处理的表达式。