2

我正在尝试使用 a 的Expression内部LINQ Select。这是我的代码示例

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'

我该如何解决?

4

2 回答 2

6

听起来您using System.Linq;在代码文件的顶部缺少 a 。但请注意,这List<T>是 LINQ-to-Objects;失去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) 建议了单个对象。这……令人困惑。

于 2013-03-14T08:11:25.503 回答
0

请看一下为什么要使用 Expression<Func<T>> 而不是 Func<T>?.

接受的答案描述了它Func<T>是返回 a 的方法的委托TExpression<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));

所以如果你真的需要一个表达式,你需要将它编译成实际的委托,否则首先使用委托。

(顺便说一句:您的代码示例将无法编译,因为Selecta没有List<user>采用表达式的方法,也d => d.user.username可能是错误的。既然d是 auser它应该是d => d.username)。

但是 linq to entity 不支持委托调用。因此,您必须通过添加切换到linq to objectsAsEnumerable()

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 objects。

PS:lambdad => d.username被编译成一个委托。如果您将其显式放入表达式b.user.Select(u => u.username)中,它将正常工作,因为现在这也编译为 linq to entity 无需调用委托即可处理的表达式。

于 2013-03-14T14:41:46.280 回答