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

C# 将linq查询作为对象发送到服务器,c#,entity-framework,linq-to-entities,self-tracking-entities,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查询是直接数据访问我需要将它们发送到我的数据服务器,但我需要一个对象。如何实现这一点?由于表达式树不可序列化,因此无法轻松实现 我的数据访问层不是用EF构建的,因此我的解决方案可能对您有帮助,也可能对您没有帮助,但无论如何,它是这样

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

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

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

由于表达式树不可序列化,因此无法轻松实现

我的数据访问层不是用EF构建的,因此我的解决方案可能对您有帮助,也可能对您没有帮助,但无论如何,它是这样的:
我在客户端将表达式解析为一个自制的可序列化表达式(具有“列”、“连接”、“过滤器”等属性),在服务器端,我根据这些表达式创建sql。

当然,您可以从它们创建表达式,并根据EF linq提供程序发送它们

由于表达式树不可序列化,因此无法轻松地进行

我的数据访问层不是用EF构建的,因此我的解决方案可能对您有帮助,也可能对您没有帮助,但无论如何,它是这样的:
我在客户端将表达式解析为一个自制的可序列化表达式(具有“列”、“连接”、“过滤器”等属性),在服务器端,我根据这些表达式创建sql。

当然,您可以从它们创建表达式,并根据EF linq提供程序发送它们

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

这当然可以处理——WCF数据服务已经做到了这一点。它们具有上下文的客户端“代理”,查询被序列化为OData查询字符串,表达式树是从服务器端的该字符串构建的。它们也支持投影,但不支持STE。试试看


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

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

这当然可以处理——WCF数据服务已经做到了这一点。它们具有上下文的客户端“代理”,查询被序列化为OData查询字符串,表达式树是从服务器端的该字符串构建的。它们也支持投影,但不支持STE。试试看


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

首先,IIRC您无法序列化表达式,所以首先看一下post

然后是以下几点:

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

D.R

首先,IIRC你不能序列化表达式,所以首先看看post

然后是以下几点:

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

D.R

我认为这最终是一种奇怪的方法。让逻辑服务器端将其公开为一个特定的Web服务或几个特定的Web服务,而不是公开一个接受要执行的逻辑作为输入的通用Web服务,这不是更好吗?你想做一个通用函数吗<代码>公共对象域(object[]input){}我认为这最终是一种奇怪的方法。让逻辑服务器端将其公开为一个特定的Web服务或几个特定的Web服务,而不是公开一个接受要执行的逻辑作为输入的通用Web服务,这不是更好吗?你想做一个通用函数吗<代码>公共对象域(对象[]输入){}