Linq to sql 正在执行插入到。。。使用LINQ到SQL进行选择

Linq to sql 正在执行插入到。。。使用LINQ到SQL进行选择,linq-to-sql,bulkinsert,Linq To Sql,Bulkinsert,我试图弄清楚是否可以使用LINQtoSQL执行“insertinto…select”类型命令。一段LINQtoSQL代码,允许我向数据库发送一个SQL命令,将多行插入到给定的表中 例如,如何使LINQ to SQL将以下T-SQL语句发送到SQL Server数据库 INSERT INTO Table1 SELECT Table2.column1 + 1 AS column1, Table2.column2 + 2 AS column2 WHERE Table2.column3 > 10

我试图弄清楚是否可以使用LINQtoSQL执行“insertinto…select”类型命令。一段LINQtoSQL代码,允许我向数据库发送一个SQL命令,将多行插入到给定的表中

例如,如何使LINQ to SQL将以下T-SQL语句发送到SQL Server数据库

INSERT INTO Table1 
SELECT Table2.column1 + 1 AS column1, Table2.column2 + 2 AS column2
WHERE Table2.column3 > 100
当然,我可以通过使用
DataContext.ExecuteCommand
函数来实现这一点,但这将立即执行,而不会利用使用
DataContext.SubmitChanges
获得的自动事务处理。除此之外,我还有一系列更新,我希望在出现错误时将它们全部回滚

有什么想法吗

更新:以下是实际代码:

        var bs_prep =
            from b in dc.T_EDR_FILEBODies
            join
            unpaid in dc.V_UNPAIDs
            on
                b.NUM_ADC.Substring(1, 9) equals unpaid.NOCONT
            join
            acordo in dc.T_ACORDOS_RECOM_APREs
            on
                Convert.ToInt32(b.NUM_ADC.Substring(1, 9)) equals acordo.ID_Contrato
            where
                b.ID_EDR == id_edr
                &&
                (
                    unpaid.NUM_INCUMPRIMENTOS <= max_unpaid_consec
                    &&
                    unpaid.TOTAL_NUM_INCUPRIMENTOS <= max_unpaid_nonconsec
                )
                ||
                (
                    acordo.Activo == true
                    &&
                    acordo.Data_Recomeco <= now
                )
            select new
                {
                    ID_EDR = id_edr_filt,
                    NUM_LINHA = b.NUM_LINHA,
                    CODREJ = b.CODREJ,
                    HDT = b.HDT,
                    IMPORT = b.IMPORT,
                    NIB_DEV = b.NIB_DEV,
                    NUM_ADC = b.NUM_ADC,
                    REF_DD_BC = b.REF_DD_BC,
                    REF_MOV = b.REF_MOV
                }
            ;


        dc.T_EDR_FILEBODies.InsertAllOnSubmit(
            bs_prep.Select(
                b => new T_EDR_FILEBODY{
                    CODREJ = b.CODREJ,
                    HDT = b.HDT,
                    ID_EDR = b.ID_EDR,
                    IMPORT = b.IMPORT,
                    NIB_DEV = b.NIB_DEV,
                    NUM_ADC = b.NUM_ADC,
                    NUM_LINHA = b.NUM_LINHA,
                    REF_DD_BC = b.REF_DD_BC,
                    REF_MOV = b.REF_MOV
                }
            )
        );
var bs_prep=
来自dc.T_EDR_文件体中的b
参加
未支付的dc.V_未付款项
在…上
b、 NUM_ADC.Substring(1,9)等于unpaid.NOCONT
参加
dc.T中的acordo\u acordo\u RECOM\u APREs
在…上
Convert.ToInt32(b.NUM_ADC.Substring(1,9))等于acordo.ID_Contrato
哪里
b、 ID_EDR==ID_EDR
&&
(
unpaid.NUM\u INCUMPRIMENTOS您可以使用

ctx.Table1.InsertAllOnSubmit(
    mySelectEnumeration.Select(x => new Table1DT { ... })
);
  • InsertAllOnSubmit
    在Linq to SQL表中插入大量条目
  • mySelectEnumeration
    是选择要插入的项的查询
  • Select(newtable1dt{…})
    是将所选查询的数据类型转换为表的数据类型所需的转换
或者,您可以使用
ExecuteCommand
方法手动管理事务

using (var ctx = new DataClasses1DataContext()) {
    ctx.Connection.Open();
    using (ctx.Transaction = ctx.Connection.BeginTransaction()) {
        ctx.ExecuteCommand("sqlcommand");
        ctx.Transaction.Commit();
    }
}
或使用交易范围:

using (var ctx = new DataClasses1DataContext()) {
    using (var scope = new TransactionScope()) {
        ctx.ExecuteCommand("sqlcommand");
        scope.Complete();
    }
}

您是否可以“使用_tx作为新的TransactionScope()然后将ExecuteCommand和其他任何东西包装在其中?我想我可以,我可能只是太挑剔了,但我发现很难接受你不能使用linq在…select语句中插入。这将是一个巨大的手动映射。我不确定我是否理解你的建议。我看不到如何在内联控件上初始化Table1DT实例基于mySelectEnumeration的uctor。如何引用mySelectEnumeration?或者,我尝试封装第一个查询(返回IQueryable)在另一个查询中,Select子句上有一个Table1DT内联构造函数,因此返回一个IQueryable。但我得到的错误与在第一个查询中使用内联构造函数时得到的错误相同:不允许在查询中显式构造实体类型“Table1DT”。因为我不知道具体的DataContext类(在我的示例中为ctx),我使用了占位符。
Table1
是表的占位符,表中的项目应该被插入。
mySelectEnumeration
是您选择要插入的项目的查询结果。
Table1DT
是您的
Table1
的数据类型。
..
指示您必须插入的位置设置“Table1”的属性,例如
ID=x.identifier
。如果不知道您的数据上下文,我就不能更具体了。好吧,我错了,我想我没有像应该读的那样彻底地阅读您的答复(我错过了“x=>”).好的,我试过了,但在InsertAllOnSubmit调用中仍然得到了相同的异常:不允许在查询中显式构造实体类型“Table1DT”。(我使用的符号与您使用的符号相同).我读过这篇文章,我有一个想法,由于某种原因,你不能在querys中构造实体。但我不太明白为什么。@Rui:你能发布你的代码吗?很难猜到你在做什么。