实体框架Linq递归搜索到列表

本文关键字:列表 搜索 递归 框架 Linq 实体 | 更新日期: 2023-09-27 18:27:48

这是在Linq上获得递归搜索列表的最佳方式。

例如,如果我有一个Category类,它可以将其他类别作为子类别,并且这些类别将产品作为其子类别,比如

Category1 > Product1
          > Product2
Category2 > Product3
          > Category21 > Product31
                       > Product32
          > Product4

等等,我需要返回列表中所有类别和产品的Id。有什么办法做到这一点吗?

实体框架Linq递归搜索到列表

首先,在您的情况下,模型应该如下所示:

public class Product
{
    public int id { get; set; }
    public string name { get; set; }
    public virtual Category Category { get; set; }
    public int CategoryID { get; set; }
}
public class Category
{
    public int id { get; set; }
    public string name { get; set; }
    public virtual ICollection<Product> Products { get; set; }
    public virtual ICollection<Category> Categories { get; set; }
    public virtual Category Parent { get; set; }
    public int? ParentID { get; set; }
    private List<int> GetIds(Category category)
    {            
        var list = Products == null ? new List<int>() : Products.Select(x => x.id).ToList();
        if (Categories != null)
            Categories.ToList().ForEach(x => {
                list.Add(x.id);
                list.AddRange(x.GetIds(x));
            }
        );            
        return list;
    }
    public List<int> GetIds()
    {
        return GetIds(this);
    }
}

你将以这种方式执行:

var db = new DataContext();
//switching on "LazyLoading" is extremely necessary
db.Configuration.LazyLoadingEnabled = true;
var first = db.Categories.Where(x => x.id == 5).First();
var ids = first.GetIds();