使用Entity Framework存储过程加载父子数据

时间:2016-12-08 05:00:41

标签: c# entity-framework

我有两个存储过程,一个用于加载父数据,另一个用于加载子数据。反正有没有以更好的方式做到这一点?请参阅下面的代码。

    public partial class Product
    {
        public long Id { get; set; }
        public string ProductId { get; set; }
        public string Name { get; set; }
        public string ProductionNo { get; set; }
        public string UniqueIdentificationNo { get; set; }
        public virtual ICollection<Process> Processes { get; set; }
    }

    public List<GetProductsBetween_Result> GetProductsBetween(DateTime? startDate, DateTime? endDate)
    {
        var products = DbContext.GetProductsBetween(startDate, endDate).ToList();

        foreach(var product in products)
        {
            product.Processes = DbContext.GetWaitingTime(product.Id).ToList();
        }

        return products;
    }

2 个答案:

答案 0 :(得分:0)

可以使用Linq(语言集成查询)重写整个场景。 您可以应用预先加载来获取产品的进程。这是类似的 到Linq提供的sql连接,这样一种状态,即代码优化和foreachs 并且可以减少对服务器的命中

var products = from u in dbContext.Product.Include(u => u.Processes)
            select new ProductView
            {
                item1 = XXX, 
        item2 = yyy
            };

var newdata = user.ToList().where("some lambda expressions")

具有过滤日期的条件

答案 1 :(得分:0)

我遇到了一个非常复杂的搜索问题,必须返回一个对象的完整树。

您需要做的是:

  1. 创建一个存储过程,该过程只返回一个调用多个根对象及其所有依赖对象的结果集:
  2. 即。 (添加你自己的条件)

    SELECT p.* FROM Products p WHERE p.Name LIKE '%test%';
    SELECT DISTINCT r.* FROM Processes r INNER JOIN Products p ON p.id = r.idProduct WHERE p.Name LIKE '%test%';
    
    1. 返回后,按照本文所述重新附加父对象及其子对象:
    2. https://blogs.infosupport.com/ado-net-entity-framework-advanced-scenarios-working-with-stored-procedures-that-return-multiple-resultsets/

      您需要从第一个结果集中迭代每个产品并附加其进程。

      这应该快得多,因为您只进行一次数据库往返和较少的查询。