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

时间:2011-04-19 07:52:03

标签: c# entity-framework linq-to-entities self-tracking-entities

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

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

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

3 个答案:

答案 0 :(得分:2)

严重。 Linq查询包含对上下文的引用。您没有客户端上下文,即使您拥有它也将是服务器上的不同实例。做这样的事情需要付出很大的努力。您还要将投影返回到匿名类型 - 远程执行时另一个非常复杂的功能。

这当然可以处理--WCF数据服务已经这样做了。它们具有上下文的客户端“代理”,查询被序列化为OData查询字符串,并且表达树是从服务器端的该字符串构建的。他们也支持预测,但他们不支持STE。试试WCF Data Services

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

答案 1 :(得分:1)

首先,IIRC你无法序列化表达式,所以首先看一下this帖子

然后是下面的内容:

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

答案 2 :(得分:0)

由于表达式树不可序列化,因此无法轻松完成。

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