C# EF核心渴望加载-多次加载相同的数据
我有一个产品表和一个类别表。所有产品都有FK类别ID。 如何停止多次加载数据?像这样: 类别:C# EF核心渴望加载-多次加载相同的数据,c#,.net,linq,.net-core,entity-framework-core,C#,.net,Linq,.net Core,Entity Framework Core,我有一个产品表和一个类别表。所有产品都有FK类别ID。 如何停止多次加载数据?像这样: 类别: public partial class Product { public Product() { OrderItem = new HashSet<OrderItem>(); ProductPictureMapping = new HashSet<ProductPictureMapping>
public partial class Product
{
public Product()
{
OrderItem = new HashSet<OrderItem>();
ProductPictureMapping = new HashSet<ProductPictureMapping>();
}
public int Id { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
}
public partial class Category
{
public Category()
{
Product = new HashSet<Product>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Product { get; set; }
}
输出:
它先返回产品,然后返回类别,然后返回类别下的所有产品
请注意,我已经在startup.csNewtonsoft.Json.ReferenceLoopHandling.Ignore中使用它禁用了循环
您可以使用
数据传输对象(DTO)
模型来摆脱创建这些引用循环的导航属性
创建以下两个DTO模型-
public class ProductDTO
{
public int Id { get; set; }
public string Name { get; set; }
public CategoryDTO Category { get; set; }
}
public class CategoryDTO
{
public int Id { get; set; }
public string Name { get; set; }
}
然后在查询中使用投影,如-
var allProduct = dbCtx.Products
.Select(p => new ProductDTO
{
Id = p.Id,
Name = p.Name,
Category = new CategoryDTO
{
Id = p.Category.Id,
Name = p.Category.Name
}
});
如果在查询结果中不需要类型化对象,则可以在不创建任何DTO模型和在投影中使用匿名类型的情况下执行相同的操作-
var allProduct = dbCtx.Products
.Select(p => new
{
Id = p.Id,
Name = p.Name,
Category = new
{
Id = p.Category.Id,
Name = p.Category.Name
}
});
在这种情况下,你能用你的逻辑帮助我吗。。。如果我想从此dto获取角色,select语句将如何执行。因为角色是角色列表
public int Id{get;set;}公共字符串用户名{get;set;}公共IList角色{get;set;}
var allProduct = dbCtx.Products
.Select(p => new ProductDTO
{
Id = p.Id,
Name = p.Name,
Category = new CategoryDTO
{
Id = p.Category.Id,
Name = p.Category.Name
}
});
var allProduct = dbCtx.Products
.Select(p => new
{
Id = p.Id,
Name = p.Name,
Category = new
{
Id = p.Category.Id,
Name = p.Category.Name
}
});