Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF核心渴望加载-多次加载相同的数据_C#_.net_Linq_.net Core_Entity Framework Core - Fatal编程技术网

C# EF核心渴望加载-多次加载相同的数据

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>

我有一个产品表和一个类别表。所有产品都有FK类别ID。 如何停止多次加载数据?像这样:

类别:

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