【问题标题】:Set or update data in LINQ在 LINQ 中设置或更新数据
【发布时间】:2011-08-26 11:09:14
【问题描述】:

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

有什么帮助吗?谢谢。

【问题讨论】:

  • 另外,你应该用 using 语句括起来 DB,因为它实现了 IDisposable。

标签: c# .net linq compiler-errors


【解决方案1】:

通过不在查询中调用GetEnumerator,您实际上并没有从数据库中检索任何内容。将您的查询包装在 () 中,并使用 ToList()、First()、Single() 或其他人来调用查询。

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

从那里仅返回您将返回单个 int 的 ID,如果您想更新您的实体,则使用 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();
}

【讨论】:

    【解决方案2】:

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

    我会说你这样做:

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

    【讨论】:

      【解决方案3】:

      那是因为您的 LINQ 表达式返回一个 IEnumerable 因为 Select。

      抛出异常的行如下所示:

       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
      
           }
      

      【讨论】:

        【解决方案4】:
        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】:
              // 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;
          }
          

          【讨论】:

          • 插入一个 D.WF_ID == ID 的值 Doc_id 列
          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-02-07
            • 1970-01-01
            • 2022-01-21
            • 1970-01-01
            • 1970-01-01
            • 2021-11-17
            • 1970-01-01
            • 2018-07-13
            相关资源
            最近更新 更多