如何使用Linq将数据连接到实体和WCF数据服务

本文关键字:数据 实体 WCF 服务 连接 何使用 Linq | 更新日期: 2023-09-27 18:21:54

我有4个相关实体,如下所示:

LocalAgency<-0..1----1->Agency<-0..1----1->Organization<-0..1----1->Customer

换句话说,LocalAgency具有一个相关的Agency等。使用Entity Framework(包含浏览这些关系的导航属性)来建立数据模型,并建立WCF DataService来向客户端提供该数据。

在使用DataService的客户端,我试图根据客户名称返回本地代理的查询,但还没有找到一种受支持的方法来制定这个简单的查询。

我尝试的第一种方法是使用Expand,如下所示:

var items = (from i in Context.LocalAgencies.Expand("Agency").Expand("Organization").Expand("Customer")
             where (String.IsNullOrEmpty(CustomerName) || i.Agency.Organization.Customer.CustomerName.Contains(CustomerName))
             select i).Skip(StartIndex).Take(PageSize).ToList<LocalAgency>();

如果"联接"只有1级深度,但无法获得导航属性的导航属性,则此方法有效。

然后我尝试了一个join,如下所示:

var items = (from localAgency in Context.LocalAgencies
             join agency in Context.Agencies on localAgency.CustomerID equals agency.CustomerID
             join organization in Context.Organizations on localAgency.CustomerID equals organization.CustomerID
             join customer in Context.Customers on localAgency.CustomerID equals customer.CustomerID
             where (String.IsNullOrEmpty(CustomerName) || customer.CustomerName.Contains(CustomerName))
             select localAgency).Skip(StartIndex).Take(PageSize).ToList<LocalAgency>();

但是,在此实例中不支持join

然后我尝试使用Except方法,如下所示:

IQueryable<LocalAgency> items = Context.LocalAgencies;
items = items.Except(from i in items
                     where (String.IsNullOrEmpty(CustomerName) || i.Agency.Organization.Customer.CustomerName.Contains(CustomerName))
                     select i).Skip(StartIndex).Take(PageSize);

但是,在此实例中不支持Except

我错过了什么?我是否需要在DataService侧设置一些东西,以允许沿定义的导航属性进行简单联接?

如何使用Linq将数据连接到实体和WCF数据服务

我在Expand上使用了错误的语法。我做了以下事情:

var items = (from i in Context.LocalAgencies.Expand("Agency").Expand("Agency/Organization").Expand("Agency/Organization/Customer")
where (String.IsNullOrEmpty(CustomerName) || i.Agency.Organization.Customer.CustomerName.Contains(CustomerName))
select i).Skip(StartIndex).Take(PageSize).ToList<LocalAgency>();