【发布时间】:2020-11-10 02:19:50
【问题描述】:
已编辑
我有表Customers、Sites、Buildings 和Addresses。
每个客户都有零个或多个(一个?)站点,每个站点都是一个客户的站点,即外键 Site.CustomerId 所指的站点。
同样,每个站点都有零个或多个建筑物,每个建筑物都在一个站点上,即外键 Building.SiteId 所指的站点。
最后:每个客户/站点/建筑物只有一个地址,即外键Customer.CustomerPhysicalAddressId、Site.AddressId、Building.BuildingAddressId所指的地址。
我还有一个string searchText
我想要至少具有以下一项的所有客户的 ID:
-
CustomerName类似于searchText - 至少有一个
SiteName类似于searchText - 至少有一个
BuildingName,类似于searchText -
PhysicalAddress喜欢searchText - 所有
Sites中的至少一个SiteAddress类似于searchText - 所有
Buildings中的至少一个BuildingAddress类似于searchText
对于上述要求,我有这个 SQL 查询逻辑
SELECT DISTINCT c.customerID
FROM Customer AS c
LEFT OUTER JOIN Site AS s ON s.customerId = c.customerID
LEFT OUTER JOIN Building AS b ON s.Id = b.siteId
LEFT OUTER JOIN Address AS A ON A.addressId = c.customerPhysicalAddressID
OR A.addressId = s.AddressId
OR A.addressId = b.buildingAddressId
WHERE
c.customerName LIKE '%searchText%'
OR c.SiteName LIKE '%searchText%'
OR b.buildingName LIKE '%searchText%'
OR A.Street LIKE '%searchText%'
在编写 linq 查询时,控制器类出现问题。
我的 Linq 查询是这样写的
if (!string.IsNullOrEmpty(searchText))
{
var resultQuery = from customer in this.DatabaseContext.Customers
join site in this.DatabaseContext.Sites
on customer.customerID equals site.CustomerId into customer_site_group
from customer_site in customer_site_group.DefaultIfEmpty()
join building in this.DatabaseContext.Buildings
on customer_site.Id equals building.siteId into site_building_group
from site_building in site_building_group.DefaultIfEmpty()
join A in this.DatabaseContext.Addresses
on new
{
key1 = customer.customerPhysicalAddressID,
key2 = customer_site.AddressId,
key3 = site_building.buildingAddressID
}
equals new
{
key1 = A.addressID ||
key2 = A.addressID ||
key3 = A.addressID
} into Address_site_building
where (customer.customerName.Contains(searchText) ||
customer_site.siteName.Contains(searchText) ||
site_building.buildingName.Contains(searchText) ||
A.street.Contains(searchText))
select new
{
customerID = customer.customerID
};
}
在结果查询中,我只想让客户 ID 满足上述条件。在引入Addresses 实体之前,linq 查询工作正常。面对写入多个on条件,LinqPad报错
连接子句中的表达式之一的类型不正确。调用 GroupJoin 时类型引用失败
我是 EF 和 linq 的新手 - 只是尝试并理解它。
感谢任何有价值的 cmets 和答案。
【问题讨论】:
-
为什么卡住了?它不做你想做的事吗?你有编译器错误吗?
-
首先,使用
customer.Sites、site.Buildings、...等导航属性,然后只需使用from address in Addresses where ... || ... || ...。 -
@GertArnold 你能详细说明一下吗?
标签: c# entity-framework linq sql-to-linq-conversion