微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

林克链接 .includes 是否可以避免连接大型数据集?

如何解决林克链接 .includes 是否可以避免连接大型数据集?

我正在使用存储库/工作单元模式构建一个 n 层应用程序,但是我在读取相关实体的属性时遇到了麻烦,因为它们没有加载。我已经确定问题是由延迟加载引起的。一个简化的示例可能是尝试在下面的代码中检索 Book 的作者,因为 Book 的 Author 和 Publisher 属性都为 null。

总的来说,我对延迟加载很感兴趣,因为这(据我所知)应该会减少传输的数据量。这对我来说特别有趣,因为我并不总是在我的 Razor 页面中使用所有属性或集合。 也就是说,我不确定这是一个好的策略,并且正在考虑将整个架构从存储库/工作单元模式中移除。我还没有决定。

public Author 
{
    public int Id {get; set;}
    public string Name {get; set;}
    public ICollection<Book> Books {get; set;}
    public ICollection<Publisher> Publishers {get; set;}
}

public Book
{
    public int Id {get; set;}
    public string Title {get; set;}
    public int AuthorId {get; set;}
    public ICollection<Author> Authors {get; set;}
    public Publisher Publisher {get; set;}
}

public Publisher
{
    public int Id {get; set;}
    public string Name {get; set;}
    public ICollection<Book> Books {get; set;}
    public ICollection<Author> Authors {get; set;}
}

回到问题。首先,我尝试应用 .Include(p=>p.Author).Load(p=>p.Author),但意识到在 .ToListAsync() 之后这是不可能的,我在通用存储库中的 `GetAllAsync()' 方法调用它。

现在我正在考虑将 DbContext 直接注入我的 Razor 页面或服务层,然后链接 Include() 调用 e.i.

_context.DBSetBooks<Book>.Include(p => p.Publisher).Where(p => p.Publisher.Name == "Manning").Include(p => p.Author);

上面的想法是为了减少传输的数据量,还是我完全误解了?

我不太喜欢在每个 Razor 页面中注入 DBContext - 这就是我首先选择存储库/工作单元设计模式的原因..如果我仍然想要延迟加载,我应该尝试而是 DDD 模式?

关于如何进行的任何想法?

解决方法

要减少传输的数据量,您必须减少 .include,因此请像这样进行查询(这只是个主意):

首先创建只有你需要的字段的类:

public class BookInfo
{
 public int Id {get; set;}
  public string AuthorName {get; set;}
 public string PublisherName {get; set;}
.... and so on
}

使用这样的查询获取图书列表:

 var books = await _context.Set<Book>()
.Where(p => p.Publisher.Name == "Manning")
.Select (b =>  new  BookInfo {
Id = b.Id,AuthorName=b.Author.Name,PublisherName=b.Publisher.Name,....and so on

}).ToArrayAsync();

另一种可能性是您将部分类 Book 放在一个单独的文件中,并带有像这样的额外字段

public partial class Book 
{
 [NotMapped]
  public string AuthorName {get; set;}
[NotMapped]
 public string PublisherName {get; set;}
}

在这种情况下,您可以使用相同的类 Book 而不是 BookInfo:

.Select ( b => new  Book {
Id = b.Id,....and so on

}).ToArrayAsync();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。