1

タイプ T は外界に公開されているため、メソッドがタイプFunc< T, bool >の述語を取るシナリオがありますが、実際にその述語を使用するときは、そのメソッドが別のメソッドを呼び出す必要があります。 T のプロパティが U のプロパティにマップされるFunc< U, bool >を取り込みます。

より具体的な例は次のようになります。

public IEnumerable<ClientEntity> Search(Func<ClientEntity, bool> predicate)
{
    IList<ClientEntity> result = new List<ClientEntity>();

    // Somehow translate predicate into Func<Client, bool> which I will call realPredicate.
    _dataFacade.Clients.Where(realPredicate).ToList().ForEach(c => result.Add(new ClientEntity() { Id = c.Id, Name = c.Name }));

    return result.AsEnumerable();
}

それは可能でしょうか?

ClientEntity は私が独自に定義した POCO クラスであり、Client はモデルによって作成された Entity Framework クラス (DB が最初) であることに注意してください。

ありがとう!

4

3 に答える 3

1

私はかつてこれを試みました。式ツリーがより単純な操作(等しい、大きい-次に、小さい-次になど)で構成されている場合、それはそれほど悪くない動作の式ツリーリライターになりました。

ここで見つけることができます。

次のように使用できます。

Expression<Func<Poco1>> where1 = p => p.Name == "fred";
Expression<Func<Poco2>> where2 = ExpressionRewriter.CastParam<Poco1, Poco2>(where1);
于 2013-03-07T12:29:29.313 に答える
0

EFはラムダを使用しません-使用しますExpression Trees

Func<T, bool> lambda = ( o => o.Name == "fred" );
Expression<Func<T, bool>> expressionTree = ( o => o.Name == "fred" );

式ツリーは、特定の式を表すメモリ内のオブジェクトグラフです。

それらは単なるオブジェクトであるため、作成または変更できます。

別のリンクは次のとおりです。MSDN: How to: Modify Expression Trees

于 2013-03-07T12:20:27.363 に答える
0

私がやったことは、式ツリーの使用を必要としませんでした:

public IEnumerable<ClientEntity> Search(Func<ClientEntity, bool> predicate)
{
    IList<ClientEntity> result = new List<ClientEntity>();

    Func<Client, bool> realPredicate = (c => predicate(ConvertFromClient(c)));        
    _dataFacade.Clients.Where(realPredicate).ToList().ForEach(c => result.Add(ConvertFromClient(c)));

    return result.AsEnumerable();
}

private static ClientEntity ConvertFromClient(Client client)
{
    ClientEntity result = new ClientEntity();

    if (client != null)
    {
        // I actually used AutoMapper from http://automapper.org/ here instead of assigning every property.
        result.Id = client.Id;
        result.Name = client.Name;
    }

    return result;
}
于 2013-03-15T12:39:30.070 に答える