我有以下Linq语句,用于检索表中满足特定条件的所有行的列表。
var set = db.TcSet
.Where(x => x.SetName.Equals(original.SetName))
.AsEnumerable()
.Where(x => x.SetName == original.SetName))
此特定语句用于编辑表中具有特定名称的所有实体。因此,在original
中检索属性的初始名称,并检查数据库中与条件匹配的所有其他条目。
当前输出
如果我有两个名称为Play123
的条目并且编辑其中一个条目,where query
的输出只包含一个元素。
如果有条目Play123
和Play1234
,并且我尝试将Play123
修改为Play1234
,则where query
的输出包含两个元素: Play123
和Play1234
。
我错过了什么导致了这种意想不到的行为。
更新
var original = db.TcSet.Find(tcSet.TcSetID);
foreach (var set in db.TcSet
.Where(x => x.SetName.Equals(original.SetName))
.AsEnumerable()
.Where(x => x.SetName == original.SetName)))
{
if (set.SetName == original.SetName) // This was added again due to the unexpected behavior
{
set.ModifiedBy = User.Identity.Name;
set.ModifiedOn = DateTime.Now;
set.PhysicalUnit = tcSet.PhysicalUnit;
db.Entry(set).State = EntityState.Modified;
db.Entry(set).Property(x => x.CreatedBy).IsModified = false;
db.Entry(set).Property(x => x.CreatedOn).IsModified = false;
db.Entry(set).Property(x => x.TechnicalCharacteristicID).IsModified = false;
}
}
现在我已经通过迭代表格中的所有元素解决了这个问题,我知道这不是最好的做法。
工作代码
var editlist = db.TcSet.Where(x => x.SetName == original.SetName).AsEnumerable().Where(x=>x.SetName==original.SetName).ToList();
foreach(var set in editlist)
// do save
当我删除if条件时,它有效。
答案 0 :(得分:0)
如果要以不同方式处理abc
和ABC
,您希望在第一个.Where()子句中执行不区分大小写的检查。
var set = db.TcSet
.Where(x => x.SetName.Equals(original.SetName, StringComparison.OrdinalIgnoreCase));
我还建议在迭代foreach之前缓存结果,因为你在迭代它时更改源列表,这绝不是一个好主意。
var original = db.TcSet.Find(tcSet.TcSetID);
var sets = db.TcSet
.Where(x => x.SetName.Equals(original.SetName, StringComparison.OrdinalIgnoreCase))
.ToList();
foreach (var set in sets)
{
set.ModifiedBy = User.Identity.Name;
set.ModifiedOn = DateTime.Now;
set.PhysicalUnit = tcSet.PhysicalUnit;
db.Entry(set).State = EntityState.Modified;
db.Entry(set).Property(x => x.CreatedBy).IsModified = false;
db.Entry(set).Property(x => x.CreatedOn).IsModified = false;
db.Entry(set).Property(x => x.TechnicalCharacteristicID).IsModified = false;
}