gpt4 book ai didi

c# - 有条件地包含和 ThenInclude

转载 作者:行者123 更新时间:2023-11-30 17:38:27 24 4
gpt4 key购买 nike

众所周知,EF-Core 中没有延迟加载。因此,这意味着我不得不事后才进行查询。既然要思考,那我就试着好好的去做吧。

我有一个相当标准的更新查询,但我想嘿,我不必总是包含 HeaderImagePromoImage FK 对象。应该有办法做到这一点。但是我以后找不到执行包含的方法。事实上,我想在我实际处理该对象之前添加它。那样我也许可以自动化一些渴望。

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

额外

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

最佳答案

我使用的是类似于 Alexander Derck 的解决方案。 (关于评论中提到的异常:ctx.ArticleContents.AsQueryable() 也应该有效。)

对于几个 CRUD MVC 站点,我使用的是 BaseAdminController。在派生的具体 Controller 中,我可以动态添加 Includes。来自 BaseAdminController:

// TModel: e.g. ArticleContent
private List<Expression<Func<TModel, object>>> includeIndexExpressionList = new List<Expression<Func<TModel, object>>>();

protected void AddIncludes(Expression<Func<TModel, object>> includeExpression)
{
includeIndexExpressionList.Add(includeExpression);
}

后来我看到我需要更大的灵 active ,所以我添加了一个queryable。例如。对于 ThenInclude()。

private Func<IQueryable<TModel>, IQueryable<TModel>>  IndexAdditionalQuery { get; set; }

protected void SetAdditionalQuery(Func<IQueryable<TModel>, IQueryable<TModel>> queryable)
{
IndexAdditionalQuery = queryable;
}

这里是 Index Action :

public virtual async Task<IActionResult> Index()
{
// dynamic include:
// dbset is for instance ctx.ArticleContents
var queryable = includeIndexExpressionList
.Aggregate(dbSet.AsQueryable(), (current, include) => current.Include(include));
if(IndexAdditionalQuery != null) queryable = IndexAdditionalQuery(queryable);
var list = await queryable.Take(100).AsNoTracking().ToListAsync();
var viewModelList = list.Map<IList<TModel>, IList<TViewModel>>();

return View(viewModelList);
}

在我使用的具体 Controller 中:

AddIncludes(e => e.EventCategory);

SetAdditionalQuery(q => q
.Include(e => e.Event2Locations)
.ThenInclude(j => j.Location));

关于c# - 有条件地包含和 ThenInclude,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36697464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com