我创建了一个存储过程,并在其中加入了几个表:
SELECT ...
FROM [Place] AS [P]
JOIN [Timezone] AS [TZ]
ON [TZ].[TimezoneId] = [P].[TimezoneId]
JOIN [Address] AS [A]
ON [P].[PlaceId] = [A].[PlaceId]
我有一个
Category
表,与 Place
表具有一对一关系,我还有一个 SubCategory
表,与 Place
表具有多对多关系,如下所示这个(用 C# 创建):
地点:
public Guid CategoryId { get; set; }
public Category Category { get; set; }
public IList<SubCategory> SubCategories { get; set; }
子类别:
public List<Place> Places { get; set; }
我想做的是在该存储过程上使用
@categoryName
过滤器,该过滤器将找到 Category
表或 SubCategory
表的匹配项,不能同时存在,因为用户可以在这种情况下,一次仅选择一个过滤器,将类别视为对象 1、2、3,将子类别视为对象 4、5、6。
令人困惑的名字而不解释,但这只会使帖子更长。
但是,对于
SubCategory
表,需要查询 Place
表和 SubCategory
表之间的多对多关系。
当我使用 EF Core 创建此关系时,它创建了一个链接表
PlaceSubCategory
,我想在本例中使用它并连接它,以便我可以以这种方式查询(尽管目前它有缺陷) ):
WHERE
(Category.Name = @categoryName OR SubCategory.Name = @categoryName)
并且有一个过滤器,我可以运行
Category
表和 SubCategory
表并找到匹配项,然后返回匹配结果。
但是,我似乎不太明白如何正确执行此操作,而且我在网上找不到相关信息,在我的书中也找不到。
SELECT P.PlaceID,*
FROM [Place] AS [P]
LEFT [Category] as cat on (P.placeid=cat.placeid)
LEFT [SubCategory] as subcat on (P.placeid=subcat.placeid)
LEFT JOIN [Timezone] AS [TZ]
ON [TZ].[TimezoneId] = [P].[TimezoneId]
LEFT JOIN [Address] AS [A]
ON [P].[PlaceId] = [A].[PlaceId]
WHERE (cat.Name = @categoryName OR subcat.Name = @categoryName)