Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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# 访问SQL Server表中的子记录_C#_Sql_Sql Server_Linq To Sql - Fatal编程技术网

C# 访问SQL Server表中的子记录

C# 访问SQL Server表中的子记录,c#,sql,sql-server,linq-to-sql,C#,Sql,Sql Server,Linq To Sql,鉴于我缺乏SQL Server经验,并且考虑到此任务是业务线应用程序的常见任务,我想问一下,也许有一种标准的、通用的方法来执行以下数据库操作: 假设我们有两个表,它们通过一对多关系相互连接,例如SalesOderHeader和saleorderlines 字段salesfeaderno是SalesOderHeader表中的PK和salesforderlines表中的FK 在前端应用程序中,用户通过单击GridView中的复选框字段,在SalesOderHeader表中选择一些记录,例如使用日期

鉴于我缺乏SQL Server经验,并且考虑到此任务是业务线应用程序的常见任务,我想问一下,也许有一种标准的、通用的方法来执行以下数据库操作:

假设我们有两个表,它们通过一对多关系相互连接,例如
SalesOderHeader
saleorderlines

字段
salesfeaderno
SalesOderHeader
表中的PK和
salesforderlines
表中的FK

在前端应用程序中,用户通过单击GridView中的复选框字段,在
SalesOderHeader
表中选择一些记录,例如使用日期范围,或
IsSelected
字段。然后,用户对所选范围的销售订单执行一些操作(让它只是“移动到另一个表”)

我的问题是:

在这种情况下,我如何访问
SalesOrderLines
表中的子记录,以便以尽可能简单、正确、快速和优雅的方式对这些子记录执行相同的操作(在我们的例子中是“移动到另一个表”)?
我不知道“最佳实践”,但我使用的是:

 var header = db.SalesOrderHeaders.SingleOrDefault(h => h.SaleHeaderNo == 14);
 IEnumerable<SalesOrderLine> list = header.SalesOrderLines.AsEnumerable();

 // now your list contains the "many" records for the header
 foreach (SalesOrderLine line in list)
 {  
      // some code
 }
var header=db.SalesOrderHeaders.SingleOrDefault(h=>h.SaleHeaderNo==14);
IEnumerable list=header.SalesOrderLines.AsEnumerable();
//现在,您的列表包含标题的“许多”记录
foreach(列表中的销售订单行)
{  
//一些代码
}
我试着按照你的桌子设计来建模,但是名字可能有点不同

现在,我不确定这是否是“最佳实践”方式


已编辑:注意到您想要全部更新它们,可能需要移动到另一个表。由于LINQ-To-SQL不能进行批量插入/更新,因此您可能希望使用t-SQL进行批量插入/更新。

如果您对基于t-SQL的解决方案(与C#/LINQ相反)感到满意,您可以这样做:

-- define a table to hold the primary keys of the selected master rows
DECLARE @MasterIDs TABLE (HeaderNo INT)

-- fill that table somehow, e.g. by passing in values from a C# apps or something

INSERT INTO dbo.NewTable(LineCodeNo, Item, Quantity, Price)
   SELECT SalesLineCodeNo, Item, Quantity, Price 
   FROM dbo.SalesOrderLine sol
   INNER JOIN @MasterIDs m ON m.HeaderNo = sol.SalesHeaderNo

这样,您可以根据选择标准将子表中的一整套行插入到新表中。

您的问题对我来说仍然有点模糊,因为我不确定“移动到另一个表”会带来什么。这是否意味着有另一个表具有两个示例表的确切架构

然而,这里有一个解决方案。当用户提交SalesOrderHeader记录时,将执行如下操作:

Update SalesOrderHeader
Set....
Where SalesOrderHeaderNo = @SalesOrderHeaderNo

Or

Insert SomeOtherTable
Select ...
From SalesOrderHeader 
Where SalesOrderHeaderNo = @SalesOrderHeaderNo
在同一操作中,是否存在不能对行项目执行某些操作的原因,例如:

Insert SomeOtherTableItems
Select ...
From SalesOrderLineItems
Where SalesOrderHeaderNo = @SalesOrderHeaderNo

您的标签中有“linq to sql”-您想要C#/linq解决方案,还是正在寻找T-sql(基于sql Server的)解决方案???@marc_s我在我的应用程序中使用linq to sql,但我不确定此工具是否适用于此类任务。如果是,我将使用LINQ。但也许使用T-SQL可以以更标准、更简单的方式完成。所以,我只需要你的建议和帮助。谢谢是的,LINQ to SQL非常适合ORM部件—将表映射到对象,因此您可以轻松地处理客户、订单等。但它不太适合面向批处理的操作,例如将一整串订单从一个表复制到另一个表—对于这些事情,我会使用直接T-SQL(无论是在存储过程中,还是在DataContextI上使用ExecuteQuery方法,我都按照您的建议制作,它就像一个符咒。这个带有额外PK保持表和InnerJoin的技巧是我一直在寻找的。非常简单、高效和优雅的方法。非常感谢您!