c# - Entity Framework Core - 包含在本地或数据库搜索扩展方法中
问题描述
为了始终在本地数据库上下文而不是数据库本身中进行第一次搜索并支持包含相关实体,我有以下扩展方法:
public static T LocalOrDatabase<T>(this DbSet<T> set, Expression<Func<T, bool>> criteria, params Expression<Func<T, object>>[] includes) where T : class {
return LookUp(set.Local.AsQueryable(), criteria) ?? // Search local
LookUp(set.AsQueryable(), criteria, includes); // Search database
}
private static T LookUp<T>(IQueryable<T> source, Expression<Func<T, bool>> criteria, params Expression<Func<T, object>>[] includes) where T : class {
if (includes != null && includes.Any()) {
foreach (Expression<Func<T, object>> include in includes) {
source = source.Include(include);
}
}
return source.FirstOrDefault(criteria);
}
假设这些示例实体:
[Table("entities1", Schema = "entities")]
public class Entity1
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Field1 { get; set; }
public string Field2 { get; set; }
public int? IdRelatedEntity1 { get; set; }
[ForeignKey("IdRelatedEntity1")]
public virtual RelatedEntity1 RelatedEntity1 { get; set; }
public int? IdRelatedEntity2 { get; set; }
[ForeignKey("IdRelatedEntity2")]
public virtual RelatedEntity2 RelatedEntity2 { get; set; }
public virtual List<RelatedEntity3> RelatedEntities3 { get; set; }
}
它被称为的方式:
Expression<Func<Entity1, bool>> criteria = e1 =>
e1.Field1 == X &&
e1.Field2 == Y;
_context.Entity1.LocalOrDatabase(criteria,
// Includes
e1 => e1.RelatedEntity1,
e1 => e1.RelatedEntity2);
然而,通过使用此解决方案,我无法从 Entity1 中包含实体 RelatedEntity3 的内部字段 (RelatedEntity4),因为它们之间的关系不是一对一的。
预期行为:
_context.Entity1.LocalOrDatabase(criteria,
// Includes
e1 => e1.RelatedEntity1,
e1 => e1.RelatedEntity2,
e1 => e1.RelatedEntities3.RelatedEntity4);
我需要整合“ThenInclude”的行为。有任何想法吗?我不在乎方法的剧烈变化。
解决方案
推荐阅读
- javascript - 引导模式中下一个按钮的 if 语句
- apache-spark - 仅基于 azure databricks 中的前 1000 行显示样本
- python - python 中的 __name__ 有什么重要的?
- angular - 茉莉花测试失败:预期的间谍 openQuickSubtypes 已被调用。上下文菜单测试用例
- javascript - 如何检查动画是否在 Vue Nativescript 中结束?
- java - 处理 Java 中的图像路径
- sql-server - 如何在每个 ID 的最大月份选择 Date,ID,Qty
- android - WorkManager如何中断进程
- mule - 如何在不使用任何点平台版本 2 的情况下在 mule4.x 运行时环境上部署打包的自定义策略
- c++11 - 将 shared_ptr 隐式转换为 bool