实体框架查询单个查询中的相关实体

时间:2018-11-19 21:09:42

标签: linq lambda entity-framework-6

我拥有带有4个级别的父子数据的层次结构数据。 CropCategory有许多农作物,其中有许多子农作物,而继而又有许多品种。每个实体都有一个ID和一个Description,其中描述在单个实体中不是唯一的,而是全部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 :(得分:0)

使用应在模型中定义的导航属性:

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();