我有一个 4 层架构项目,即用户界面、业务逻辑、服务 (WCF) 和数据访问 (EF6) 层。我在我的服务上公开了接受表达式的方法,我可以将该表达式传递到我的数据访问层以使用 EF 进行评估。但是,这不起作用,因为 Expression<Func>
不可序列化。
在我的客户端,我希望能够构建可查询的表达式以发送到服务器端并返回正确的投影。
服务器端:
public virtual IEnumerable<Person> Get(Expression<Func<Person, bool>> expression)
{
using (var ctx = MyContext())
{
IQueryable<PersonDto> col = ctx.DbContext.People.Where(expression);
//
return col.ToList();
}
}
客户端:
public IEnumerable<PersonDto> GetFromService(Expression<Func<PersonDto, bool>> expression)
{
using (MyService client = new MyService())
{
return client.Get(expression);
}
}
除了我这样做的方式,还有其他选择吗?表达式和函数不可序列化是否有原因?
最佳答案
您可以使用 Remote.Linq为了这。该项目目前托管在 GitHub 上,但似乎没有文档。但是你可以使用 old one来自 CodePlex。
实现这一点的最简单方法(从旧文档复制的代码)
// create linq expression
System.Linq.Expressions.Expression<Func<Order, bool>> linqExpression =
order => order.Items.Where(i => i.ProductId == prodId).Sum(i => i.Quantity) > 1;
// transform linq expression into serializable expression tree
Remote.Linq.Expressions.LambdaExpression serializableExpression =
linqExpression.ToRemoteLinqExpression();
// transform serializable expression tree back into linq expression
System.Linq.Expressions.Expression<Func<Order, bool>> recreatedLinqExpression =
serializableExpression.ToLinqExpression<Order, bool>();
关于c# - 由于表达式树不可序列化,如何使用无法使用 WCF 工作的表达式树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40361088/