Entity Framework query Связанные объекты в одном запросе - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть иерархические данные с 4 уровнями родительских дочерних данных. В CropCategory есть много культур, в которых есть много подколов, которые, в свою очередь, содержат много сортов. У каждой сущности есть идентификатор и описание, где описания не уникальны в отдельных сущностях, а представляют собой комбинацию всех 4.

Мне нужно идентифицировать один Культивар из набора Описаний. У меня есть следующий код, который отлично работает, но я уверен, что это не самый эффективный способ получить ответ. Я хотел бы сделать это в одну поездку в базу данных.

string cropCategoryDescription = "Some Crop Category"
string cropDescription = "Some Crop"
string subCropDescription = "Some SubCrop"
string cultivarDescription = "Some Cultivar"

CropCategory cropCategory = _context.CropCategories.FirstOrDefault(cc => cc.Description == cropCategoryDescription);

Crop crop = _context.Crops.FirstOrDefault(c => c.Description == cropDescription && c.CropCategoryId == cropCategory.CropCategoryId);

SubCrop subCrop = _context.SubCrops.FirstOrDefault(sc => sc.Description == subCropDescription && sc.CropId == crop.CropId);

Cultivar cultivar = _context.Cultivars.FirstOrDefault(cu => cu.Description == cultivarDescription && cu.SubCropId == subCrop.SubCropId);

CurrentCultivar = cultivar;

Я прочитал довольно много постов и блогов в поисках теории, но меня смущают различные термины. Будем благодарны за любые идеи, чтобы указать мне правильное направление.

1 Ответ

0 голосов
/ 20 ноября 2018

Используйте свойства навигации, которые должны быть определены в ваших моделях:

var result = _context.Cultivars
    .Where( cu =>
        cu.Description == cultivarDescription
        && cu.SubCrop.Description == subCropDescription
        && cu.SubCrop.Crop.Description == cropDescription
        && cu.SubCrop.Crop.CropCategory.Description == cropCategoryDescription )
    // projection to match your results
    // but you could use Include()'s on _context.Cultivars
    .Select( cu => new
    {
        Cultivar = cu,
        SubCrop = cu.SubCrop,
        Crop = cu.SubCrop.Crop,
        CropCategory = cu.SubCrop.Crop.CropCategory,
    })
    .FirstOrDefault();
...