如何使用 AsExpandable 包含具有过滤条件的相关实体

问题描述 投票:0回答:2

我想包含具有某些过滤条件的相关实体。这可能吗? 我不想为此编写投影查询。所以我试图通过下面的代码来实现这一点......但它不起作用。

我的域对象

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

对此的最佳实践或最佳解决方案是什么?

提前致谢:)

entity-framework linq linqkit
2个回答
1
投票

到目前为止,我找到了 2 个解决方案来解决我的问题 1.投影查询

var result = db.UserRef
.Select(p => new
{
    User= p,
    UserNewsLetterMaps = p.UserNewsLetterMaps.Where(c => c.Subscribe == true)
})
.ToList();
  1. 使用预加载来加载相关实体。

    _context.Entry(user).Collection(u => u.UserNewsLetterMaps) .Query().Where(news => news.Subscribe) .Select(news => news).Include(news => news.DocTypeRef) .Load();
    

0
投票

您始终可以创建一个组合两个实体的 var 的对象,并填充您有条件包含的部分。

就我个人而言,我会在数据库中创建一个视图,其中包含您想要避免此类条件的所有内容(我不知道您的上下文到底是什么),但认真地说,视图与实体/linq 配合得很好,每次我想到尝试像我在这里看到的那样,我改为使用我的数据库,并且我总是获得很多速度和简单性(如果您还没有一千个视图)。

© www.soinside.com 2019 - 2024. All rights reserved.