1

我有一个场景,其中一个方法将采用Func< T, bool >类型的谓词,因为类型 T 是暴露给外部世界的谓词,但是当实际使用该谓词时,我需要该方法来调用另一个方法采用Func< U, bool >其中 T 的属性映射到 U 的属性。

一个更具体的例子是:

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 是由模型创建的实体框架类(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 不使用 lambdas - 它使用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 回答