在LINQ中设置或更新数据

本文关键字:更新 数据 设置 LINQ | 更新日期: 2023-09-27 18:06:39

通过LINQ我想比较记录的id=参数的id那么我想要设置或更新同一记录中的doc_id。我在这里写了几行:

public void Fill_WF_Doc(string ID, int doc)
{
    DataClasses1DataContext DB = new DataClasses1DataContext();
    Waiting_Task entry = new Waiting_Task();
    var c = from D in DB.Waiting_Tasks
            where (D.WF_ID == ID)
            select D.Doc_ID;
    c = doc;
 }

但我有一个错误:

无法将类型"int"隐式转换为"System.Linq.IQueryable">

有什么帮助吗?非常感谢。

在LINQ中设置或更新数据

在查询中不调用对GetEnumerator的调用,实际上并没有从数据库中检索到任何内容。用()包装查询,并使用ToList()First()Single()或其他方法调用查询。

Waiting_Task entry = (from D in DB.Waiting_Tasks
                      where (D.WF_ID == ID)
                      select D).FirstOrDefault();

从那里只返回Id,你将返回一个int,如果你想更新你的实体,则使用select D 返回完整的对象

我想在同一条记录中设置或更新doc_id。

从那里,您可以简单地更新值和SubmitChanges(),将更新后的值推回到数据库。

public void Fill_WF_Doc(string ID, int doc)
{
  DataClasses1DataContext DB = new DataClasses1DataContext();
  Waiting_Task entry = (from D in DB.Waiting_Tasks
                        where (D.WF_ID == ID)
                        select D).FirstOrDefault();
  entry.Doc_ID = doc;
  DB.SubmitChanges();
}

select操作的结果是IEnumerable<T>,在您的情况下是IEnumerable<int>,因为Doc_ID是int类型。

我会说你这样做:

c.ToList().ForEach(e => e = doc);

这是因为您的LINQ表达式由于Select返回了一个IEnumerable。

引发异常的行如下所示:

 public void Fill_WF_Doc(string ID, int doc)
    {
        DataClasses1DataContext DB = new DataClasses1DataContext();
        Waiting_Task entry = new Waiting_Task();
        var c = from D in DB.Waiting_Tasks
                where (D.WF_ID == ID)
                select D.Doc_ID;
        c = doc;//this throw an exception as doc is an Int but c is an ienumerable
     }
DataClasses1DataContext DB = new DataClasses1DataContext();
var docs = from D in DB.Waiting_Tasks
           where (D.WF_ID == ID)
           select D; // select all the docs met the criteria
foreach(var D in docs)
{
    D.Doc_ID = doc;
}

DataClasses1DataContext DB = new DataClasses1DataContext();
var docs = DB.Waiting_Tasks.Where(D => D.WF_ID == ID); // or FirstOrDefault() if ID is key or unique constraint
...
    // c is an IEQueryable<int>
    var c = from D in DB.Waiting_Tasks
            where (D.WF_ID == ID)
            select D.Doc_ID;
    // Error is here, you affect an int to an IQueryable<int>
    c = doc;

你想干什么?


编辑

要更新c.WF_ID,请执行以下操作:

var c = (from D in DB.Waiting_Tasks
        where (D.WF_ID == ID)
        select D.Doc_ID).FirstOrDefault();
if(c != null)
{
    c.WF_ID = doc;
}

c返回一个(获取(项列表,而不是单个项。您需要迭代结果集并应用更新,或者使用Single/First方法之一来获取一个值并更新它,正如其他人所指出的那样。

此外,如果要更新实体中的值,则需要将整个对象投影出去,然后编辑要更新的值。通过投影单个ID,对象类型的其余部分将丢失,EF不知道如何将更新与底层数据库行对齐。