当延迟加载禁用时,如何通过实体框架仅将导航属性的特定属性包含到查询中?

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

我的项目禁用了LazyLoading。我想获得具有类别导航属性的Id = 1的Product。但我只需要类别的Id和Name属性。这就是为什么我希望类别导航属性只有这两个字段。是否可以创建这样的查询?

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } 
    public dobule Price{ get; set; }
    public string Description { get; set; }
    public bool IsDeleted { get; set; }       
    public DateTime CreatedDate { get; set; }   
    public DateTime ModifiedDate { get; set; }      

    public int CategoryId{ get; set; }
    public Category Category{ get; set; }  
}

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; } 
    public dobule Description{ get; set; }
    public Category IsDeleted { get; set; }       
    public DateTime CreatedDate { get; set; }   
    public DateTime ModifiedDate { get; set; } 
}
entity-framework entity-framework-core lazy-loading
2个回答
1
投票

如果您只需要几个特定字段,则需要明确选择它们。像这样的东西会起作用:

dbContext.Products
    .Select(p => new Product
    {
        Id = p.Id,
        Name = p.Name,
        // etc... The fields you need from product go here
        Category = new Category
        {
            Id = p.Category.Id,
            Name = p.Category.Name
        }
    }

拥有仅具有两个字段的Product和Category模型类可能更好。现在,您的方法将返回一个Category对象,该对象缺少调用者可能不期望的大多数字段的值。取决于你究竟在做什么。


0
投票

如果您在调用数据库之前知道自己想要什么,则取决于。

  1. 如果你知道你知道什么,那么你可以使用一些'包含'逻辑或来自@Sangman的awnser或检查文件here
  2. 如果您已在内存中拥有该实体,那么您决定加载其他导航属性。
context.Entry(yourEntity).Reference(a => a.Category).Load();

更多例子here

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