2016-02-15 2 views
0

У меня есть следующая инструкция Linq, которая используется для извлечения списка всех строк таблицы, которые удовлетворяют конкретному условию.Неожиданное поведение предложения `Where`

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.

Что мне не хватает, что приводит к неожиданному поведению.

Update

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 

Когда я извлекал, если состояние он работал.

+0

Как вы отредактируете записи? –

+0

Нам может понадобиться немного больше кода, чтобы получить лучшее представление о том, что вы пытаетесь сделать. –

+0

Я добавлю логику контроллера Edit в код. – Vini

ответ

0

Вы хотите сделать проверку без учета регистра в своем первом предложенииWhere(), если вы хотите по-разному обрабатывать abc и ABC.

var set = db.TcSet 
    .Where(x => x.SetName.Equals(original.SetName, StringComparison.OrdinalIgnoreCase)); 

Я хотел бы также предложить кэшировать результаты перед переборе в Еогеасп, так как вы изменения списка источников в то время как итерация через него, который никогда не является хорошей идеей.

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; 
} 
Смежные вопросы