Получить свойство навигации с помощью внутреннего соединения - PullRequest
1 голос
/ 23 января 2012

Я создал модель данных сущности для следующих таблиц базы данных в 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 с левым внешним объединением.

Можно ли просто сказать, что я хочу только уязвимости с непустой уязвимостью software_vulnerability и с INNER JOIN все в порядке?

Спасибо!

Ответы [ 2 ]

1 голос
/ 23 января 2012

Нет.Вы не можете контролировать использованные соединения.Вы можете попытаться отменить запрос:

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

Вы получите все уязвимости в программном обеспечении для вашей единственной ожидаемой уязвимости, и эта уязвимость будет включена.Если ваше отношение связано с тем, что уязвимость программного обеспечения правильно настроена как обязательная, следует надеяться на использование внутреннего соединения.

0 голосов
/ 23 января 2012

Я думаю, что это может быть медленно, потому что вы используете счетчик.Я бы просто попробовал .Any () здесь вместо этого, так как это, вероятно, будет намного быстрее

...