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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当延迟加载禁用时,如何通过实体框架仅将导航属性的特定属性包含到查询中?相关的知识,希望对你有一定的参考价值。

我的项目禁用了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; } 
}
答案

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

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对象,该对象缺少调用者可能不期望的大多数字段的值。取决于你究竟在做什么。

另一答案

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

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

更多例子here

以上是关于当延迟加载禁用时,如何通过实体框架仅将导航属性的特定属性包含到查询中?的主要内容,如果未能解决你的问题,请参考以下文章

C#,Winform绑定实体框架(Entity Framework)的实体,如何去掉或隐藏导航属性?

如何使用代码优先实体框架在 ASP.Net MVC3 中重新加载多对多导航属性

尝试仅将某些实体加载到表视图中

hibernate 延迟加载

JavaWeb系列——Hibernate——延迟加载(转)

Hibernate Lazy属性