Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 我可以转换函数吗<;T、 布尔>;到函数<;U、 布尔>;其中T和U是POCO类,我可以将其中一个的属性映射到另一个?如果是,怎么做?_Linq_Entity Framework 4_Linq To Entities - Fatal编程技术网

Linq 我可以转换函数吗<;T、 布尔>;到函数<;U、 布尔>;其中T和U是POCO类,我可以将其中一个的属性映射到另一个?如果是,怎么做?

Linq 我可以转换函数吗<;T、 布尔>;到函数<;U、 布尔>;其中T和U是POCO类,我可以将其中一个的属性映射到另一个?如果是,怎么做?,linq,entity-framework-4,linq-to-entities,Linq,Entity Framework 4,Linq To Entities,我有一个场景,其中一个方法将接受Func类型的谓词,因为T类型是对外公开的,但是当实际使用该谓词时,我需要该方法调用另一个方法,该方法将接受Func,其中T的属性映射到U的属性 一个更具体的例子是: public IEnumerable<ClientEntity> Search(Func<ClientEntity, bool> predicate) { IList<ClientEntity> result = new List<ClientEnt

我有一个场景,其中一个方法将接受Func类型的谓词,因为T类型是对外公开的,但是当实际使用该谓词时,我需要该方法调用另一个方法,该方法将接受Func,其中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();
}
public IEnumerable搜索(Func谓词)
{
IList结果=新列表();
//以某种方式将谓词转换为Func,我将其称为realdpredicate。
_dataFacade.Clients.Where(realperedicate.ToList().ForEach(c=>result.Add(newcliententity(){Id=c.Id,Name=c.Name}));
返回结果;
}
那可能吗

请注意,ClientEntity是我自己定义的POCO类,而Client是由模型创建的实体框架类(DB优先)


谢谢

EF不使用lambdas-它使用

Func lambda=(o=>o.Name==“fred”);
表达式expressionTree=(o=>o.Name==“fred”);
表达式树是表示给定表达式的内存中对象图

因为它们只是对象,所以可以创建或修改它们


这里还有另一个链接:

EF不使用lambdas-它使用

Func lambda=(o=>o.Name==“fred”);
表达式expressionTree=(o=>o.Name==“fred”);
表达式树是表示给定表达式的内存中对象图

因为它们只是对象,所以可以创建或修改它们


这里还有一个链接:

我曾经尝试过这样做。当表达式树由更简单的操作(等于、大于、小于等)组成时,它产生了一个不错的工作表达式树重写器

可以找到它

您可以将其用作:

Expression<Func<Poco1>> where1 = p => p.Name == "fred";
Expression<Func<Poco2>> where2 = ExpressionRewriter.CastParam<Poco1, Poco2>(where1);
表达式,其中1=p=>p.Name==“fred”;
表达式,其中2=ExpressionRewriter.CastParam(其中1);

我曾经尝试过这样做。当表达式树由更简单的操作(等于、大于、小于等)组成时,它产生了一个不错的工作表达式树重写器

可以找到它

您可以将其用作:

Expression<Func<Poco1>> where1 = p => p.Name == "fred";
Expression<Func<Poco2>> where2 = ExpressionRewriter.CastParam<Poco1, Poco2>(where1);
表达式,其中1=p=>p.Name==“fred”;
表达式,其中2=ExpressionRewriter.CastParam(其中1);

我最终所做的不需要使用表达式树:

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;
}
public IEnumerable搜索(Func谓词)
{
IList结果=新列表();
Func realperedicate=(c=>谓词(ConvertFromClient(c));
_dataFacade.Clients.Where(realdpredicate.ToList().ForEach(c=>result.Add(ConvertFromClient(c));
返回结果;
}
私有静态客户端ConvertFromClient(客户端)
{
客户实体结果=新客户实体();
如果(客户端!=null)
{
//实际上我用的是来自http://automapper.org/ 这里不是分配每个属性。
result.Id=client.Id;
result.Name=client.Name;
}
返回结果;
}

我最终所做的不需要使用表达式树:

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;
}
public IEnumerable搜索(Func谓词)
{
IList结果=新列表();
Func realperedicate=(c=>谓词(ConvertFromClient(c));
_dataFacade.Clients.Where(realdpredicate.ToList().ForEach(c=>result.Add(ConvertFromClient(c));
返回结果;
}
私有静态客户端ConvertFromClient(客户端)
{
客户实体结果=新客户实体();
如果(客户端!=null)
{
//实际上我用的是来自http://automapper.org/ 这里不是分配每个属性。
result.Id=client.Id;
result.Name=client.Name;
}
返回结果;
}