【问题标题】:Executing a Remote.Linq expression against data对数据执行 Remote.Linq 表达式
【发布时间】:2020-09-01 12:36:49
【问题描述】:

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

但是,我看不到如何执行 表达式。通常我会调用 Compile() 和 Invoke() 方法来针对数据执行 Expression。但 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");
    }
}

如何调用 Remote.Linq 表达式?

【问题讨论】:

    标签: serialization deserialization json-deserialization


    【解决方案1】:

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

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

    这是来自Remote.Linq 源代码库的示例代码:

    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();
    }
    
    

    此外,还有其他用于使用 EF 和 EF Core 执行表达式的 nuget 包,因此您只需向 Execute 方法提供 DbContext

    此外,您可能还想查看项目 github 存储库中的演示/示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-01
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多