Linq 我可以转换函数吗<;T、 布尔>;到函数<;U、 布尔>;其中T和U是POCO类,我可以将其中一个的属性映射到另一个?如果是,怎么做?
我有一个场景,其中一个方法将接受FuncLinq 我可以转换函数吗<;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
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;
}
返回结果;
}