【问题标题】:Possible to return linked object with Stored Procedure可以使用存储过程返回链接对象
【发布时间】:2016-07-28 15:24:55
【问题描述】:

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

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

经过阅读后,我添加了一个存储过程(将 SP 添加到返回 ISingleResult 的 dbml 文件中,因此创建了一个新方法,我在其中迭代 SP 数据并将其添加到我的客户对象列表中)。我这样做是为了加快获取和显示数据的速度。到目前为止,这运作良好。

问题是我以前从客户那里获取订单详细信息时,我曾经写过这个

foreach (Customer c in Customer)
{

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

}

使用存储过程方法 c.Orders 为空,因此我将相关关系添加到 SP 但 Orders 始终为空 - 唯一改变的是返回的行数与订单数相同客户已下单,但我无法像添加 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
    }

//....
}

【问题讨论】:

  • 我假设您的客户类有一个虚拟属性Orders?您正在加入存储过程中的 Orders 表吗?该过程不会仅仅因为关系表而自行执行此操作。
  • 也许你可以分享一下这个过程以及你是如何称呼它的。
  • 我已将基本的 SQL 和 C# 代码添加到我的原始帖子中。谢谢
  • 能否包含映射文件和您所说的正常工作的 LINQ 查询?
  • 我的意思是,我将一个表拖到我的 dbml 文件中,它为我完成了其他所有工作。我不必在这部分编写任何代码,但我所做的只是获取客户并遍历添加到我的客户对象并作为列表返回的数据(上面的代码)

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


【解决方案1】:

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

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

【讨论】:

  • 我不认为 LINQ to Entities 是问题所在。听起来@Computer 有 LINQ 工作,但将其转换为存储过程却没有。
【解决方案2】:

您实际上并没有选择 Orders 对象,您只是在获取 ID。

尝试将您的存储过程简化为:

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

【讨论】:

  • 我这样做并得到了相同的结果。我的猜测是 GetCustomers 还需要修改,以便列表知道该客户有可用的订单?如果是这样,我在这个阶段迷路了:-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多