“Where”子句的意外行为

时间:2016-02-15 07:53:50

标签: c# mysql asp.net-mvc linq

我有以下Linq语句,用于检索表中满足特定条件的所有行的列表。

var set = db.TcSet
    .Where(x => x.SetName.Equals(original.SetName))
    .AsEnumerable()
    .Where(x => x.SetName == original.SetName))

此特定语句用于编辑表中具有特定名称的所有实体。因此,在original中检索属性的初始名称,并检查数据库中与条件匹配的所有其他条目。

当前输出

如果我有两个名称为Play123的条目并且编辑其中一个条目,where query的输出只包含一个元素。

如果有条目Play123Play1234,并且我尝试将Play123修改为Play1234,则where query的输出包含两个元素: Play123Play1234

我错过了什么导致了这种意想不到的行为。

更新

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条件时,它有效。

1 个答案:

答案 0 :(得分:0)

如果要以不同方式处理abcABC,您希望在第一个.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;
}