IncludeFilter несколько уровней не работает - PullRequest
0 голосов
/ 02 марта 2019

Проблемы с этим IncludeFilter и включением нескольких уровней.Я использую Entity Framework 6 Plus.

Это пример, который они предоставляют https://entityframework -plus.net / query-include-filter под заголовком Load multiple levels.

Это работает, но возвращает больше записей о гарантии, чем я хочу.

db.Application.Where(x => x.ApplicationId == applicationId)
    .Include(x => x.Lienholder)
    .Include(x => x.Warranty.Select(y => y.Coverage.CoverageGroup))
    .Include(x => x.Vehicle)
    .Include(x => x.Vendor)
    .First();

Это работает, но .Coverage имеет значение null, но оно ближе всего к примеру.

db.Application.Where(x => x.ApplicationId == applicationId)
    .Include(x => x.Lienholder)
    .IncludeFilter(x => x.Warranty.Where(z => true).Where(z =>
        z.WarrantyStatusId == 2 ||
        z.WarrantyStatusId == 3 ||
        z.WarrantyStatusId == 8 ||
        z.WarrantyStatusId == 10
    )
    .IncludeFilter(x => x.Warranty.Where(z => true).Where(z =>
        z.WarrantyStatusId == 2 ||
        z.WarrantyStatusId == 3 ||
        z.WarrantyStatusId == 8 ||
        z.WarrantyStatusId == 10
    ).Select(y => y.Coverage.CoverageGroup))
    .Include(x => x.Vehicle)
    .Include(x => x.Vendor)
    .First();

Это вообще не работает, потому что, очевидно, в IncludeFilter вы должны включить предложение where

db.Application.Where(x => x.ApplicationId == applicationId)
    .Include(x => x.Lienholder)
    .IncludeFilter(x => x.Warranty.Where(z => true).Where(z =>
        z.WarrantyStatusId == 2 ||
        z.WarrantyStatusId == 3 ||
        z.WarrantyStatusId == 8 ||
        z.WarrantyStatusId == 10
    ).Select(y => y.Coverage.CoverageGroup))
    .Include(x => x.Vehicle)
    .Include(x => x.Vendor)
    .First();

Это работает, но не требует загрузки Coverage

db.Application.Where(x => x.ApplicationId == applicationId)
    .Include(x => x.Lienholder)
    .IncludeFilter(x => x.Warranty.Where(z => true).Where(z =>
        z.WarrantyStatusId == 2 ||
        z.WarrantyStatusId == 3 ||
        z.WarrantyStatusId == 8 ||
        z.WarrantyStatusId == 10
    )
    .Include(x => x.Vehicle)
    .Include(x => x.Vendor)
    .First();

1 Ответ

0 голосов
/ 02 марта 2019
  • Вы не можете смешивать Include с IncludeFilter или IncludeOptimized.
  • . Вам необходимо включить каждый путь один раз в его собственный IncludeFilter

Вваш самый близкий пример, вы пропустили включение «Y.Coverage»

В настоящее время это ограничение библиотеки.

Вот что вы ищете:

db.Application.Where(x => x.ApplicationId == applicationId)
    .IncludeFilter(x => x.Lienholder)
    .IncludeFilter(x => x.Warranty.Where(z =>
        z.WarrantyStatusId == 2 ||
        z.WarrantyStatusId == 3 ||
        z.WarrantyStatusId == 8 ||
        z.WarrantyStatusId == 10
    ))
    .IncludeFilter(x => x.Warranty.Where(z => true).Where(z =>
        z.WarrantyStatusId == 2 ||
        z.WarrantyStatusId == 3 ||
        z.WarrantyStatusId == 8 ||
        z.WarrantyStatusId == 10
    ).Select(y => y.Coverage))
    .IncludeFilter(x => x.Warranty.Where(z => true).Where(z =>
        z.WarrantyStatusId == 2 ||
        z.WarrantyStatusId == 3 ||
        z.WarrantyStatusId == 8 ||
        z.WarrantyStatusId == 10
    ).Select(y => y.Coverage.CoverageGroup)))
    .IncludeFilter(x => x.Vehicle)
    .IncludeFilter(x => x.Vendor)
    .First();

Это вообще не работает, потому что очевидно, что с IncludeFilter вы должны включить предложение where

Нет, у вас нет.

...