Func<T> ではなく Expression<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));
したがって、式が本当に必要な場合は、それを実際のデリゲートにコンパイルする必要があります。それ以外の場合は、最初にデリゲートを使用してください。
(ところで:式を取るSelect
a のメソッドがなく、おそらく間違っているため、コード例はコンパイルされません。 aであるため、 である必要があります)。List<user>
d => d.user.username
d
user
d => d.username
ただし、エンティティへの linq はデリゲート呼び出しをサポートしていません。したがって、以下を追加して、オブジェクトへの linqに切り替える必要がありますAsEnumerable()
。
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 entities を使用します。このようにして、データベースのクエリを最適化できますが、さらに必要な場合は linq to objects に切り替えます。
PS: ラムダd => d.username
はデリゲートにコンパイルされます。明示的に式に入れるとb.user.Select(u => u.username)
、デリゲートを呼び出さずにエンティティへのlinqが処理できる式にコンパイルされるため、正常に機能します。