【发布时间】:2021-01-22 15:21:43
【问题描述】:
在我们的项目中,我们的数据库中存储了多种语言的文本。 我想创建一个在查询中包含文本的辅助函数。
这很有用,因为这种包含在应用程序中经常发生,我希望将包含代码放在一个地方。
包含应使用 Entity Framework Core 5 中的 the new filtered includes。
这是我要替换的:
.Include(c => c.NameTexts.Where(t => t.LanguageId == langId))
替换为:
.IncludeText(e => e.NameTexts, langId)
我要写的函数:
// The helper function:
public static IQueryable<T> IncludeText<T>(this IQueryable<T> originalQuery, Expression<Func<T, IEnumerable<UserText>>> textToInclude, int langId) where T : class
{
var textWhere = textToInclude.Where(e => e.LanguageId == langId);
originalQuery.Include(textWhere);
return originalQuery;
}
// And call it from a query like this:
var result = await _context.SomeEntity
.IncludeText(e => e.NameTexts, langId)
// Instead of
// .Include(c => c.NameTexts.Where(t => t.LanguageId == langId))
.Where(c => c.Id == request.Id)
.SingleOrDefaultAsync(cancellationToken);
我尝试执行以下操作,但由于类型不匹配而出现错误。
Expression<Func<UserText, bool>> newPred = t => t.LanguageId == langId;
var textWhere = Expression.Lambda<Func<T, IList<UserText>>>(Expression.AndAlso(textToInclude, newPred), textToInclude.Parameters);
originalQuery.Include(textWhere);
return originalQuery;
【问题讨论】:
-
您是在谈论(经典 - 完整的 .NET 框架)实体框架 5 - 还是指新的实体框架 Core v5?请在您的帖子正文和您使用的标签中非常清楚!
-
Entity Framework Core v5,抱歉忘记了完整的 .NET 也有 EF 5 版本。
标签: c# entity-framework-core .net-5 linq-expressions