可以使用存储过程返回链接对象

时间:2016-07-28 15:24:56

标签: c# .net linq stored-procedures linq-to-sql

我有两个表,即客户和订单。 1个客户可以有多个订单。这两个表之间有一个链接。

目前使用Linq to SQL获取数据并显示它。数据库已经增长,结果显示速度很慢。

经过一些阅读后,我添加了一个存储过程(将SP添加到dbml文件中,该文件返回ISingleResult,因此创建了一个新方法,我遍历SP数据并将其添加到我的Customers对象列表中)。我这样做是为了加快获取和显示数据的速度。到目前为止,这很有效。

问题是当我以前收到客户的订单详情时,我曾经写过这个

foreach (Customer c in Customer)
{

 foreach (Order o in c.Orders)
  {
    // other logic here
  }

}

使用存储过程方法c.Orders为null所以我将相关关系添加到SP但是Orders总是为null - 唯一改变的是返回的行数与订单数相同客户已经放置,但我不能像添加SP之前那样迭代订单?

关于我出错或做什么的想法?

我的存储过程:

Select Customers.*, Orders.ID 
FROM            
Customers INNER JOIN Orders ON Customers.Ordersid = Orders.Ordersid

在代码中我有

public List<Customer> GetCustomers
{
    ISingleResult<StoredProcedureName> AllCustomers = myDC.StoreProcedureName;
    List<Customer> Customers = new List<Customer>();

    foreach (var c in AllCustomers)
    {
       //Add each property from SP into List properties and return List
    }

//....
}

2 个答案:

答案 0 :(得分:0)

我想您需要在查询中使用Include子句来强制dbcontext加载导航属性&#34; Orders&#34;为每个客户。看这篇文章:

How do you construct a LINQ to Entities query to load child objects directly, instead of calling a Reference property or Load()

答案 1 :(得分:0)

您实际上并没有选择订单对象,而是只抓取ID。

尝试将存储过程简化为:

Select * -- take everything
FROM            
Customers INNER JOIN Orders ON Customers.Ordersid = Orders.Ordersid