我有一些这样的 linq 查询:
from x in from dbcontext
join y in dbcontext on x.id equals y.id select new {x,y}
我的问题是如何将这些类型的查询作为对象发送到服务器这里是我的 linq 查询是直接数据访问我需要将它们发送到我的数据服务器但我需要一个对象。我该如何实现呢?
我有一些这样的 linq 查询:
from x in from dbcontext
join y in dbcontext on x.id equals y.id select new {x,y}
我的问题是如何将这些类型的查询作为对象发送到服务器这里是我的 linq 查询是直接数据访问我需要将它们发送到我的数据服务器但我需要一个对象。我该如何实现呢?
很糟糕。Linq 查询包含对上下文的引用。您没有客户端上的上下文,即使您拥有它,服务器上的实例也会不同。做这样的事情需要该死的巨大努力。此外,您正在将投影返回到匿名类型 - 远程执行时的另一个非常复杂的功能。
这当然可以处理 - WCF 数据服务已经这样做了。他们有上下文的客户端“代理”,查询被序列化为 OData 查询字符串,表达式树是从服务器端的该字符串构建的。他们也支持预测,但不支持 STE。试试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 );
博士
由于表达式树是不可序列化的,因此不容易做到。
我的数据访问层不是用 EF 构建的,因此我的解决方案可能对您有帮助,也可能对您没有帮助,但无论如何:
我将客户端的表达式解析为自制的可序列化表达式(具有“列”之类的属性) 、“joins”、“filters”等),并在服务器端根据这些表达式创建 sql。
您当然可以从它们创建表达式,并将它们发送到 EF linq 提供程序!