请看一下为什么要使用 Expression<Func<T>> 而不是 Func<T>?.
接受的答案描述了它Func<T>
是返回 a 的方法的委托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));
所以如果你真的需要一个表达式,你需要将它编译成实际的委托,否则首先使用委托。
(顺便说一句:您的代码示例将无法编译,因为Select
a没有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 无需调用委托即可处理的表达式。