首页 > 解决方案 > 有没有办法在扩展方法中过滤 ThenInclude()

问题描述

我正在尝试编写一个通用扩展方法来包含我的许多实体模型中存在的某个属性(文本元素,它们本身包含翻译集合)。

由于该方法对于许多不同类型的实体都非常有用,并且我只关心以一种语言(用户喜欢的语言)检索文本元素,因此我正在尝试编写一种通用方法,它可以采用alpha 表达式以及 LangID。

这是我到目前为止所拥有的:

public static IIncludableQueryable<TEntity, ICollection<Translation>> IncludeTextBit<TEntity>(
    this IQueryable<TEntity> source, 
    Expression<Func<TEntity, TextBit>> predicate, int LangID) 
where TEntity: class
{
    var result = source.Include(predicate).ThenInclude(t => t.Translations);

    return result;
}

public static IIncludableQueryable<TEntity, ICollection<Translation>> ThenIncludeTextBit<TEntity, TPreviousProperty>(
    this IIncludableQueryable<TEntity, TPreviousProperty> source, 
    Expression<Func<TPreviousProperty, TextBit>> predicate, 
    int LangID) 
where TEntity: class where TPreviousProperty : class
{
    var result = source.ThenInclude(predicate).ThenInclude(t => t.Translations);

    return result;
}

我想要实现的是(虽然我知道这种直接实现是不可能的):

public static IIncludableQueryable<TEntity, ICollection<Translation>> IncludeTextBit<TEntity>(
    this IQueryable<TEntity> source, 
    Expression<Func<TEntity, TextBit>> predicate, 
    int LangID) 
where TEntity: class
{
    var result = source.Include(predicate).ThenInclude(t => t.Translations.Where(l => l.LangID==LangID));

    return result;
}

有了一个允许我做这样的事情的实现:

var Articles = _db.Articles
    .Include(a => a.Likes)
    .IncludeTextBit(a => a.ArticleText, Lang.en)
    .Include(a => a.Tags)
    .ThenIncludeTextBit(t => t.TagName)
    .ToList();

我尝试了很多事情:

使用 .Select() 相反 ,我尝试使用 Select 我认为由于我正在执行通用函数,因此我不能依赖 Select。看起来我不能把它们锁起来,这将是一种耻辱。总的来说,尽管尝试过,但我不确定我是否能很好地理解这一点。

将 EfCore plus 与 .IncludeFilter() 一起使用 这似乎很有希望,但我花了几个小时试图理解有限的文档并研究我在互联网上发现的几个示例,但没有取得太大的成功。再一次,看起来这个限制非常有限,因为它不能与 EFCore 的默认 .Include() 和 .ThenInclude() 混合使用。如果最终有可能,我会很乐意做出牺牲。

Lambda 表达式改革 通过所有其余部分,我还学会了从我的谓词参数生成新的 lambda 表达式。我可能会在其他地方的某个时候再次使用它,但它似乎在这里没有用。

之后过滤元素 这最终奏效了,但我发现它非常丑陋且不太理想。基本上,我有第二个函数循环翻译并删除那些不是从所选语言中的翻译。我必须为实体可能具有的每个文本元素调用它,并且添加了许多在我看来可以以某种方式抽象为不必要的附加代码。

在这一点上,我花了大约 5 个小时来解决这个问题,我已经从所有的脑力劳动中筋疲力尽了,尤其是这听起来不应该是太难做的事情......

我想知道我是否遗漏了一些东西,或者在花了这么多时间之后,我太狭隘了,看不到解决方案。如果有人能帮助我一点,甚至只是给我一个更好的重新开始的方向,我会非常高兴。

提前非常感谢!

标签: c#generics.net-coreentity-framework-coreextension-methods

解决方案


推荐阅读