【问题标题】:Fetch navigation property with inner join使用内部连接获取导航属性
【发布时间】:2012-01-23 09:47:05
【问题描述】:

我在 SqlCe 中为以下数据库表创建了实体数据模型:

CREATE TABLE [test_vulnerabilities] (
    [id] INTEGER PRIMARY KEY,
    [description] NTEXT NOT NULL DEFAULT ''
);

CREATE TABLE [test_software_vulnerabilities]
(
    [id] INTEGER PRIMARY KEY IDENTITY,
    [vulnerability_id] INTEGER NOT NULL
                       REFERENCES [test_vulnerabilities]([id]),
    [details] NTEXT NOT NULL DEFAULT ''
);

实体(基于现有数据库添加实体模型创建):

entity Vulnerability in set Vulnerabilities
    Id int
    Description string
    Software ICollection<SoftwareVulnerability> - navigation property

entity SoftwareVulnerability in set SoftwareVulnerabilities
    Id int
    Details string
    VulnerabilityId int
    Vulnerability Vulnerability - navigation property

并执行以下查询:

        var query = (from v in entities.Vulnerabilities.Include("Software")
                     where v.Id == id && v.Software.Count > 0
                     select v);

它非常非常慢,因为生成的 SQL 将带有 software_vulnerability 的漏洞与左外连接连接起来。

有什么方法可以简单地说我只想要具有非空软件漏洞的漏洞并且 INNER JOIN 可以吗?

谢谢!

【问题讨论】:

  • 我会尝试将 .Count > 0 更改为 .Any()
  • @Wouter de Kort - 它向 SQL 添加了一些代码,但保留了 LEFT JOIN

标签: entity-framework linq-to-entities entity-framework-4.1


【解决方案1】:

没有。您无法控制已使用的联接。您可以尝试还原查询:

var query = (from s in entities.SofwareVulnerabilities.Include("Vulnerability")
             where s.VulnerabilityId == id
             select s);

您将获得单个预期漏洞的所有软件漏洞,并且该漏洞将被包括在内。如果您的关系来自软件漏洞,则正确配置为强制它应该希望使用内部连接。

【讨论】:

  • 谢谢!它将 JOIN 更改为 INNER。但我不能将此解决方案应用于更复杂的查询:-/
【解决方案2】:

我认为这可能会很慢,因为您使用的是 count。我会在这里尝试 .Any() ,因为它可能会更快

【讨论】:

  • 谢谢!添加 Any() 会将其增加 10 倍,但不会将 LEFT JOIN 更改为 INNER。奇怪...
猜你喜欢
  • 2020-12-13
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多