将linq查询作为对象发送到服务器

本文关键字:服务器 对象 linq 查询 | 更新日期: 2023-09-27 17:50:27

我有一些linq查询,像这样:

from x in from dbcontext
 join y in dbcontext on x.id equals y.id select new {x,y}

我的问题是如何将这些类型的查询发送到服务器作为对象这里是我的linq查询是直接数据访问我需要将它们发送到我的数据服务器,但我需要一个对象。

将linq查询作为对象发送到服务器

糟糕。Linq查询包含对上下文的引用。客户端上没有上下文,即使有,服务器上也会有不同的实例。做那样的事需要付出巨大的努力。此外,您正在将投影返回为匿名类型-远程执行时的另一个非常复杂的功能。

这当然可以处理- WCF数据服务已经这样做了。他们有客户端上下文的"代理",查询被序列化为OData查询字符串,表达式树是由服务器端的字符串构建的。他们也支持预测,但不支持STEs。试试WCF数据服务。

如果您不喜欢WCF数据服务的想法,您应该在服务器端为每个这样的查询公开一个方法,并且客户端必须远程调用该方法。

首先,IIRC不能序列化表达式,所以先看看这篇文章

,然后是以下内容:

public List<ContactDetails> GetAllContactDetails( List<Guid> ContactIDs, Func<List<ContactDetails>, IEnumerable<ContactDetails>> filter )
{
    List<ContactDetails> result = new List<ContactDetails>();
    // get contacts as usual, fill result
    // ...
    return filter.Invoke( result ).ToList();
}

用法:

GetAllContactDetails( idList, ( result ) =>
    from contact in result
    where contact.DateOfBirth > DateTime.Now.AddYears( -10 )
    select contact );

D。R

由于表达式树是不可序列化的,所以它不能轻松地完成。

我的数据访问层不是用EF构建的,所以我的解决方案可能对你有帮助,也可能没有帮助,但无论如何,这里是:
我在客户端将表达式解析为自制的可序列化表达式(具有"列","连接","过滤器"等属性),并在服务器端基于这些表达式创建sql。
当然,你可以从它们创建表达式,并将它们发送给EF linq提供程序!