Serialization 对数据执行远程.Linq表达式

Serialization 对数据执行远程.Linq表达式,serialization,deserialization,json-deserialization,Serialization,Deserialization,Json Deserialization,我使用序列化/反序列化我的表达式,因为我想创建将动态表达式从客户端应用程序发送到web服务的能力。标准.NET表达式无法序列化,因此我使用Remote.Linq 但是,我看不到如何执行表达式。通常我会调用Compile()和invoke()方法来对数据执行表达式。但是Remote.Linq表达式不支持这种方法 下面的单元测试可以更清楚地解释我想要实现的目标 [TestMethod] public void SerializeLinqExpressionsTests() { var tes

我使用序列化/反序列化我的表达式,因为我想创建将动态表达式从客户端应用程序发送到web服务的能力。标准.NET表达式无法序列化,因此我使用Remote.Linq

但是,我看不到如何执行表达式。通常我会调用Compile()和invoke()方法来对数据执行表达式。但是Remote.Linq表达式不支持这种方法

下面的单元测试可以更清楚地解释我想要实现的目标

[TestMethod]
public void SerializeLinqExpressionsTests()
{
    var testdata = GetTestdata();

    Expression<Func<ModuleEntityAdmins, ModuleEntityAdmin>> expr1 = m => m.Modules.Find(q => q.Id == 1);
    var remoteExpression1 = expr1.ToRemoteLinqExpression();
    string strexpr1 = SerialiseExpression(remoteExpression1);

    try
    {
        var deserexpr1 = DeserialiseExpression<Remote.Linq.Expressions.LambdaExpression>(strexpr1.NormalizeJsonString());

        //what is the equivalent of doing this with a Remote.Linq Expression?
        var compiled1 = expr1.Compile();
        var result = compiled1.Invoke(testdata);

        Assert.IsNotNull(result);
        Assert.IsTrue(result.Id == 1);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        Assert.Fail("Error deserialising LINQ expression tree");
    }
}
[TestMethod]
public void序列化LinqExpressionTests()
{
var testdata=GetTestdata();
表达式expr1=m=>m.Modules.Find(q=>q.Id==1);
var remoteExpression1=expr1.ToRemoteLinqExpression();
字符串strexpr1=SerialiseExpression(remoteExpression1);
尝试
{
var deserexpr1=反序列化表达式(strexpr1.NormalizeJsonString());
//使用Remote.Linq表达式执行此操作的等效性是什么?
var compiled1=expr1.Compile();
var result=compiled1.Invoke(testdata);
Assert.IsNotNull(结果);
Assert.IsTrue(result.Id==1);
}
捕获(例外e)
{
控制台写入线(e.Message);
Assert.Fail(“反序列化LINQ表达式树时出错”);
}
}

如何调用远程.Linq表达式?

远程Linq表达式可以转换回系统Linq表达式,并按此方式编译和执行

但是,当您向服务器发送表达式以查询数据时,这并不是您真正想要的。在服务器端,您希望使用
Execute
扩展方法对数据源执行表达式。确保为命名空间
Remote.Linq.Expressions
添加using

以下是源repo的示例代码:

using Remote.Linq.Expressions;

public interface IQueryService
{
    IEnumerable<DynamicObject> ExecuteQuery(Expression queryExpression);
}

public class QueryService : IQueryService, IDisposable
{
    // any linq provider e.g. entity framework, nhibernate, ...
    private IDataProvider _datastore = new ObjectRelationalMapper();

    // you need to be able to retrieve an IQueryable by type
    private Func<Type, IQueryable> _queryableProvider = type => _datastore.GetQueryableByType(type);

    public IEnumerable<DynamicObject> ExecuteQuery(Expression queryExpression)
    {
        // `Execute` is an extension method provided by Remote.Linq
        // it applies an expression to a data source and returns the result
        return queryExpression.Execute(queryableProvider: _queryableProvider);
    }

    public void Dispose() => _datastore.Dispose();
}

使用Remote.Linq.Expressions;
公共接口服务
{
IEnumerable ExecuteQuery(表达式queryExpression);
}
公共类QueryService:IQueryService,IDisposable
{
//任何linq提供商,如实体框架、nhibernate等。。。
private IDataProvider_datastore=new ObjectRelationalMapper();
//您需要能够按类型检索IQueryable
private Func\u queryableProvider=type=>\u datastore.GetQueryableByType(type);
公共IEnumerable ExecuteQuery(表达式queryExpression)
{
//'Execute'是Remote.Linq提供的扩展方法
//它将表达式应用于数据源并返回结果
返回queryExpression.Execute(queryableProvider:\u queryableProvider);
}
public void Dispose()=>\u datastore.Dispose();
}
此外,还有用于使用EF和EF-Core执行表达式的附加nuget包,因此您可以简单地为Execute方法提供一个
DbContext

此外,您可能希望查看在项目的github repo中找到的演示/示例