有条件包含然后包含

Tho*_*ian 5 c# linq-to-entities entity-framework entity-framework-core

众所周知,EF-Core 中不存在延迟加载。所以这意味着我不得不事后才进行查询。所以既然要思考,那我不妨尝试一下好好做。

我有一个相当标准的更新查询,但我想,嘿,我并不总是需要包含HeaderImagePromoImageFK 对象。应该有办法实现这一点。但我无法找到一种方法来稍后执行包含。事实上,我想也许在我真正对这个对象进行工作之前就包括在内。这样我也许能够自动化一些渴望。

ArticleContent ac = _ctx.ArticleContents
    .Include(a=> a.Metadata)
    .Include(a=> a.HeaderImage)
    .Include(a=> a.PromoImage)
    .Single(a => a.Id == model.BaseID);

ac.Title = model.Title;
ac.Ingress = model.Ingress;
ac.Body = model.Body;
ac.Footer = model.Footer;

if (model.HeaderImage != null)
{
    ac.HeaderImage.FileURL = await StoreImage(model.HeaderImage, $"Header_{model.Title.Replace(" ", "_")}_{rand.Next()}");
}
if (model.PromoImage != null)
{
    ac.PromoImage.FileURL = await StoreImage(model.PromoImage, $"Promo_{model.Title.Replace(" ", "_")}_{rand.Next()}");
}

ac.Metadata.EditedById = uId;
ac.Metadata.LastChangedTimestamp = DateTime.Now;

await _ctx.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud)

额外的

需要明确的是,这是EF7 (Core),我在找到一个允许我按需添加包含内容的解决方案之后,希望在初始之后_ctx.ArticleContents.Include(a=> a.Metadata).Single(a => a.Id == model.BaseID).

Ale*_*rck 0

我将创建一个方法来获取数据,该方法将属性包含为表达式:

static ArticleContent GetArticleContent(int ID, 
   params Expression<Func<ArticleContent, object>>[] includes)
{
   using(var ctx = new MyContext())
   {
      var acQuery =  _ctx.ArticleContents.Include(a=> a.Metadata);
      foreach(var include in includes)
        acQuery = acQuery.Include(include);
      return acQuery.Single(a => a.Id == model.BaseID);
   }
}
Run Code Online (Sandbox Code Playgroud)

然后在main方法中:

var ac = GetArticleContent(3, a => a.HeaderImage, a => a.PromoImage);
Run Code Online (Sandbox Code Playgroud)