我无法为下面的问题找到正确的linq to sql查询。
我有3张桌子:
A)“产品”,包含以下列:
B)“公司”,包含以下栏目:
C)“页面”,包含以下列:
有一件事是产品表中的 companyID 等于公司表中的 pageID
这主要是要知道拥有该产品的公司的URL(仅供参考,这是我必须使用的模式,所以我不能真的修改它。)
我想要达到的目标是: 用户将拥有一个表单,并将在文本框中输入公司名称,我需要能够检索该公司拥有的产品列表。
当没有母公司时,我能够做到这一点:
from p in ctx.Products
join c in ctx.Companies on p.pageID equals c.companyID
where ...
select ...
但是,如果一家公司有父母(在Page表中定义),我不知道该怎么办?那是另一个连接语句吗?
答案 0 :(得分:0)
解决此问题的最佳方法是编写视图(或存储过程)并将其导入模型,而不是编写linq查询来执行此操作。 sql查询(很可能使用公用表表达式[或CTE])在性能方面会更好。尝试使用CTE编写视图(或存储过程)。这将允许您递归查询数据库。
编辑:这是一个开始(我不是一个专门的SQL专家,所以这可能会或可能不会在首次运行时工作)
WITH CTECompanyProducts(pageID
, parentID
, pageName
, companyID
, companyFieldA
, companyFieldB
, companyFieldC
, productFieldA
, productFieldB
, productFieldC
, level)
AS
(
SELECT p.pageID
, p.parentID
, p.pageName
, c.companyID
, c.fieldA
, c.fieldB
, c.fieldC
, pr.field1
, pr.field2
, pr.field3
, 0 AS Level
FROM Page p
JOIN Company c
ON p.pageID = c.pageID
JOIN Product pr
ON pr.companyID = c.companyID
WHERE p.parentID IS NULL
UNION ALL
SELECT p.pageID
, p.parentID
, p.pageName
, c.companyID
, c.fieldA
, c.fieldB
, c.fieldC
, pr.field1
, pr.field2
, pr.field3
, Level + 1
FROM Page p
JOIN Company c
ON p.pageID = c.pageID
JOIN Product pr
ON pr.companyID = c.companyID
JOIN Page pa
ON p.pageID = pa.parentID
)
SELECT *
FROM CTECompanyProducts
Where companyID = [your company ID];