在LINQ中设置或更新数据

时间:2011-08-26 11:09:15

标签: c# .net linq compiler-errors

通过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'

有任何帮助吗?谢谢。

6 个答案:

答案 0 :(得分:1)

通过不对查询调用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();
}

答案 1 :(得分:0)

那是因为您的LINQ表达式返回了选择的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

     }

答案 2 :(得分:0)

    // 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;
}

答案 3 :(得分:0)

select操作的结果是IEnumerable<T>IEnumerable<int>,因为Doc_ID的类型为int。

我会说你这样做:

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

答案 4 :(得分:0)

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
...

答案 5 :(得分:0)

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

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