Ошибка Linq с включенным подзапросом в EF Core - PullRequest
0 голосов
/ 03 февраля 2020

Я использую MySQL БД с ядром ef, все работает нормально, но следующий запрос не возвращает ожидаемый результат.

    var query = _context.ServiceData.
        Include(x => x.Country)
        .Include(x=>x.Country.CountryLocale)
        .Where(x=>x.Country.CountryLocale.Any(l=>l.Locale == "en-US"));

После выполнения и выполнения

query.First().Country.CountryLocale.Count // Returns count of greater than 1 when expected count is 1

Таблица Имеет только 2 записи, и вышеупомянутые тянет оба, когда ожидается только 1.

Макет таблицы

Id   Name Locale
1    Test   en-US
2    Test   en-GB

Все примеры, которые я видел, предлагают делать это так, как я, поэтому не уверен чего мне не хватает.

Вот sql, сгенерированный выше Linq

SELECT `a`.`Id`, `a`.`ServiceDataCode`, `a`.`CountryId`, `a`.`Enabled`, `a`.`LastUpdated`, `a`.`TimezoneId`, `c`.`Id`, `c`.`DialingCode`, `c`.`Enabled`, `c`.`IsoNumeric`, `c`.`IsoThreeLetterCode`, `c`.`IsoTwoLetterCode`, `c`.`LastUpdated`, `c0`.`Id`, `c0`.`IsoTwoLetterCode`, `c0`.`LastUpdated`, `c0`.`Locale`, `c0`.`Name`
FROM `ServiceData` AS `a`
INNER JOIN `CountryData` AS `c` ON `a`.`CountryId` = `c`.`Id`
LEFT JOIN `CountryLocale` AS `c0` ON `c`.`IsoTwoLetterCode` = `c0`.`IsoTwoLetterCode`
WHERE EXISTS (
    SELECT 1
    FROM `CountryLocale` AS `c1`
    WHERE (`c`.`IsoTwoLetterCode` = `c1`.`IsoTwoLetterCode`) AND (`c1`.`Locale` = 'en-US'))
ORDER BY `a`.`Id`, `c`.`Id`, `c0`.`Id`

Я думаю, хранимая процедура - это еще один вариант, но я хотел обойтись без него.

1 Ответ

0 голосов
/ 04 февраля 2020

Хорошо, вот запрос объекта с правильными путями страны и указанием c локали страны, которая относится к первым данным службы:

using (var query = _context.ServiceData
    .Include("Country.CountryLocale")
    .Where(x => x.ServiceData.CountryId == x.Country.Id)
    .Where(x => x.Country.IsoTwoLetterCode == x.Country.CountryLocale.IsoTwoLetterCode)
    .Where(x => x.Country.CountryLocale.Locale == "en-US"))
{
    query.FirstOrDefault();
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...