c# - 由于表达式树不可序列化,如何使用无法使用 WCF 工作的表达式树?

标签 c# wcf serialization expression func

我有一个 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/

相关文章:

javascript - 使用 C# 在 IE BHO 中使用类前缀名称获取元素?

c# - 如何通过 HTTP 与 MSMQ 通信?

swift - 有没有办法对闭包进行编码和解码?

c# - 当它们不 "shaped"相同时,将 XML 反序列化为对象?

Java:序列化外部(最终)字段

c# - 使用 Xamarin 将带有一些标签的设备再次注册到 azure 通知中心

c# - 同时启动多个线程

c# - DataTable 的线程安全

c# - WCF 地址访问拒绝异常

wcf - 使用 WCF 的 Http 请求中缺少授权 header