2

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) });

最終的な考え; about メッセージSystem.Collections.Generic.List<W.Models.user>はリストを示唆していますが、コード ( b.User.Select/ Message.Select) は個々のオブジェクトを示唆しています。これは...紛らわしいです。

于 2013-03-14T08:11:25.503 に答える
0

Func<T> ではなく Expression<Func<T>> を使用する理由をご覧ください。.

受け入れられた答えは、それFunc<T>がを返すメソッドへのデリゲートであることを説明しています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 のメソッドがなく、おそらく間違っているため、コード例はコンパイルされません。 aであるため、 である必要があります)。List<user>d => d.user.usernameduserd => 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が処理できる式にコンパイルされるため、正常に機能します。

于 2013-03-14T14:41:46.280 に答える