使用内部联接获取导航属性

时间:2012-01-23 09:47:05

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

我在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可以吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

您将获得针对单个预期漏洞的所有软件漏洞,并且将包含此漏洞。如果您的关系来自软件漏洞已正确配置为强制,则应该使用内连接。

答案 1 :(得分:0)

我认为这可能很慢,因为你正在使用计数。我会尝试.Any()在这里,因为它可能会更快堆