WCF数据服务为您提供了访问DataServiceContext实例的方式。如果您已经生成了引用,那么这将为您进行类型化。然而,可用于您的查询操作符是有限的,我预计您将会遇到各种程度的阻力,试图使用它与仅使用Entity Framework和Linq to Entities相比较。我之所以这样期望,是因为虽然我正在使用一个略微不同的数据模型,但它是一个类似的分层模型,并且我从与您一样的较低位置开始查询。
var query = context.DataSources.
Where(x => x.ReportLayouts[0].ReportLayoutID == 1045 && x.InstanceName == "hello").
Select(li => new { InstanceName = li.InstanceName })
ToList()的结果
发生了未处理的类型为'System.NotSupportedException'的异常,位于Microsoft.Data.Services.Client.dll中
附加信息:表达式(([10007].ReportLayouts.get_Item(0).ReportLayoutID == 1045) And ([10007].InstanceName == "hello"))不受支持。
为了获取这些数据,我尝试了以下测试:
var query2 = context.DataSources.Select(x => x.ReportLayouts[0].ReportLayoutID == 1045)
var result2 = query2.ToList()
'System.NotSupportedException' 附加信息: 不支持方法 'Select'。
然后我从我的顶级实体开始,相当于你的“Person”,并运行了以下代码:
var query3 = context.Reports.Where(x =>x.ReportLayoutID == 34 && x.DatabaseInstance.ServerName == "hello")
var result3 = query3.ToList()
这很好用。我现在正在努力通过导航属性从这个顶层实体到较低层实体。直接使用DataServiceContext类,我可以更容易地组合DataServiceQuery,它直接转换为ODATA支持的URL格式,使用
AddQueryOption:
query = query.AddQueryOption("$expand", expandPropertyName)
这样可以通过生成类似于以下的url来显式地加载导航属性:
ReportService.svc/DataSources?expand=dataobjects
生成的服务引用还提供了访问DataServiceContext.LoadProperty方法的功能。一旦加载,您可以查询它,但这涉及到往返传输。
个人而言,我不会将WCF数据服务用作您的DAL,因为这就是Entity Framework的用途。如果您需要使用服务将EF模型公开给外部客户端,则情况有所不同,但是您的DAL仍应该是Entity Framework。对于执行非常简单的CRUD(没有业务逻辑)的应用程序,WCF数据服务是合适的。我不会信任它作为内部运行的复杂查询的DAL。它支持的Web方法也非常简陋,只接受诸如字符串和整数之类的基元参数。如果需要服务,我会调查WCF,但我怀疑在您的情况下不需要服务作为DAL。