在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">
有什么帮助吗?非常感谢。
在查询中不调用对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不知道如何将更新与底层数据库行对齐。