无法构造适当的linq-to-sql查询

时间:2013-11-27 19:21:30

标签: sql linq-to-sql

我无法为下面的问题找到正确的linq to sql查询。

我有3张桌子:

A)“产品”,包含以下列:

  • productID:唯一标识符
  • pageID:产品页面的标​​识符
  • companyID:拥有该产品的公司的标识符

B)“公司”,包含以下栏目:

  • companyID:公司的唯一标识符
  • pageID:公司页面的标识符

C)“页面”,包含以下列:

  • pageID:页面的唯一标识符
  • parentID:父页面的ID(基本上,公司可以拥有另一家公司,这是维护的地方) SQL diagram

有一件事是产品表中的 companyID 等于公司表中的 pageID

这主要是要知道拥有该产品的公司的URL(仅供参考,这是我必须使用的模式,所以我不能真的修改它。)

我想要达到的目标是: 用户将拥有一个表单,并将在文本框中输入公司名称,我需要能够检索该公司拥有的产品列表。

当没有母公司时,我能够做到这一点:

from p in ctx.Products
join c in ctx.Companies on p.pageID equals c.companyID
where ...
select ...

但是,如果一家公司有父母(在Page表中定义),我不知道该怎么办?那是另一个连接语句吗?

1 个答案:

答案 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];