1

嘿伙计们,我是 Linq 的新手,我正在尝试转换存储过程。但是我很难在 LINQ 中编写更新查询我在 SP 中的查询就像

 UPDATE @tempTable1
 SET someColumn = 1
 FROM @tempTable1 p, @tempTable2 t2, NonTempTable nt
 WHERE t1.id = t2.id
   AND t1.id = nt.id
   AND nt.status = 'abcd';

我在 LINQ 中编写了上述查询的以下转换

 var Obj = (from t1 in temp1
            join t2 in tmp2 on t1.id equals t2.id
            join nt in NonTempTable on t2.id equals nt.id
            where nt.status == "abcd"
            select t1).First();
 Obj.somecolumn = 1;                     
 Obj.SubmitChanges();

但我得到以下错误

Property or indexer 'AnonymousType#1.ProcedureID' cannot be assigned to -- it is read only

我只有我的应用程序的数据库,我正在尝试使用 LINQPad 将存储过程转换为 LINQ

谁能告诉我如何将上述查询写入Linq?我还需要做什么?

4

3 回答 3

0

您必须从您的 tempTable1、tempTable2 和 NonTempTable 创建一个实体。然后,您应该能够通过 Linq 处理这些表中的数据。请参阅http://msdn.microsoft.com/en-us/data/ff830362.aspx如何创建模型。

创建后,您可以更新您的记录或正确的记录并将更改保存到数据库

 var result = (from row in model.JoinedTable
         where row.status == "abcd"
         select row).First();
 result.someColumn = "1";
 model.SaveChanges();
于 2013-04-04T08:25:13.540 回答
0

Linq 用于查询,而不是更新。为了更新数据,您需要选择一个框架(或了解主要项目团队正在使用什么),该框架旨在执行此操作 - 实体框架、LinqToSQL 或普通的旧 ADO.NET(SQlCommand+SqlConnection等)。

Linq 中没有内置机制来更新内存中的数据,更不用说将更改传播到数据源了。即使使用实体框架 - 您也可以使用 Linq 来获取要更新的对象,但实际更新根本不使用 Linq,只是使用SaveChanges()示例中的属性设置器和方法。

于 2013-04-08T13:49:10.647 回答
0

终于为我的上述问题找到了解决方法

var Obj = (from t1 in temp1
        join t2 in tmp2 on t1.id equals t2.id
        join nt in NonTempTable on t2.id equals nt.id
        where nt.status == "abcd"
        select t1).First();

var anatherObj = (from o in Obj
                  select new { o.nonUpdatedColumn1, o.nonUpdatedColumn2, o.nonUpdatedColumn3, o.someColumn = 1});

并在“anatherObj”中获得了更新的临时表

于 2013-04-08T16:00:23.760 回答