如何使用 AsExpandable 包含具有过滤条件的相关实体
howt to Include related entities with filter condition using AsExpandable
我想包含具有某些过滤条件的相关实体。这可能吗 ??
我不想为此编写投影查询。所以我试图通过下面的代码来实现这一点......但它不起作用。
我的域对象
public class UserRef : BaseModel
{
public static readonly System.Linq.Expressions.Expression<Func<UserRef, ICollection<UserNewsLetterMap>>> UserNewsLetterExp =
UserNewsLetterExp => UserNewsLetterExp.UserNewsLetterMaps;
public UserRef()
{
UserNewsLetterMaps = new HashSet<UserNewsLetterMap>();
}
public int UserId { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<UserNewsLetterMap> UserNewsLetterMaps { get; set; }
}
我的存储库代码
var user = this._context.UserRefs.AsExpandable()
.Include(u => UserRef.UserNewsLetterExp.Invoke(u).Where(news => news.Subscribe).Select(news => news.DocTypeRef))
.SingleOrDefault(u => u.UserName == userName);
最佳实践或最佳解决方案是什么?
提前致谢:)
您始终可以创建一个组合两个实体的 var 的对象,并填充您本应包含的部分 conditionnaly。
我个人会在数据库中创建一个视图,其中包含您想要避免的所有这些条件包括(我不知道您的上下文到底是什么)但是认真的视图与 entity/linq 一起工作得很好每次我想尝试像我在这里看到的那样的东西时,我都会改用我的数据库,而且我总是获得很多速度和简单性(如果你还没有一千个视图)。
到目前为止,我找到了 2 个解决问题的方法
1.投影查询
var result = db.UserRef
.Select(p => new
{
User= p,
UserNewsLetterMaps = p.UserNewsLetterMaps.Where(c => c.Subscribe == true)
})
.ToList();
使用预加载加载相关实体。
_context.Entry(user).Collection(u => u.UserNewsLetterMaps) .Query().Where(news => news.Subscribe) .Select(news => news).Include(news => news.DocTypeRef) .Load();
我想包含具有某些过滤条件的相关实体。这可能吗 ?? 我不想为此编写投影查询。所以我试图通过下面的代码来实现这一点......但它不起作用。
我的域对象
public class UserRef : BaseModel
{
public static readonly System.Linq.Expressions.Expression<Func<UserRef, ICollection<UserNewsLetterMap>>> UserNewsLetterExp =
UserNewsLetterExp => UserNewsLetterExp.UserNewsLetterMaps;
public UserRef()
{
UserNewsLetterMaps = new HashSet<UserNewsLetterMap>();
}
public int UserId { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<UserNewsLetterMap> UserNewsLetterMaps { get; set; }
}
我的存储库代码
var user = this._context.UserRefs.AsExpandable()
.Include(u => UserRef.UserNewsLetterExp.Invoke(u).Where(news => news.Subscribe).Select(news => news.DocTypeRef))
.SingleOrDefault(u => u.UserName == userName);
最佳实践或最佳解决方案是什么?
提前致谢:)
您始终可以创建一个组合两个实体的 var 的对象,并填充您本应包含的部分 conditionnaly。
我个人会在数据库中创建一个视图,其中包含您想要避免的所有这些条件包括(我不知道您的上下文到底是什么)但是认真的视图与 entity/linq 一起工作得很好每次我想尝试像我在这里看到的那样的东西时,我都会改用我的数据库,而且我总是获得很多速度和简单性(如果你还没有一千个视图)。
到目前为止,我找到了 2 个解决问题的方法 1.投影查询
var result = db.UserRef
.Select(p => new
{
User= p,
UserNewsLetterMaps = p.UserNewsLetterMaps.Where(c => c.Subscribe == true)
})
.ToList();
使用预加载加载相关实体。
_context.Entry(user).Collection(u => u.UserNewsLetterMaps) .Query().Where(news => news.Subscribe) .Select(news => news).Include(news => news.DocTypeRef) .Load();