Проверка, является ли Var из запроса LINQ пустым, и возвращает значения старше x - PullRequest
1 голос
/ 19 июля 2009

Привет всем У меня сейчас 2 проблемы с кодом ниже:

  1. По возвращении результата1 я пытаюсь выполнить проверку, чтобы увидеть, если это! = Null, и если это не так, он начнет удалять выбранные записи. Проблема в том, что даже когда result1 ничего не возвращает и по умолчанию оператор if не подхватывает это, я думаю, я что-то упускаю, но что?

  2. Я хочу возвращать только те значения, которые старше 10 минут (позже это будет масштабировано до 12 часов), для этого я проверяю по a.DateTime, который является значением DateTime, хранящимся в базе данных. , Однако, если я использую операторы <= или> =, это не сработает снова, что я пропускаю?

    DateTime dateTime = DateTime.Now.Subtract(new TimeSpan(0, 0, 10, 0));
    
    var result1 = (from a in cpuInfo
                      where a.DateTime <= dateTime
                      select a).DefaultIfEmpty(null);
    
    if (result1 != null)
    {            
        foreach (TblCPUInfo record1 in result1)
        {
                localDB.TblCPUInfo.DeleteOnSubmit(record1);
                localDB.SubmitChanges();
        }
    }
    

Ответы [ 2 ]

5 голосов
/ 19 июля 2009

Филипп говорил о последовательности вещей - хотя вам даже не нужен вызов Any(). В конце концов, если нет никаких изменений, цикл просто ничего не сделает.

Вы действительно хотите отправлять изменения на каждой итерации? Вероятно, было бы разумнее сделать это один раз в конце. Кроме того, вы можете использовать DateTime.AddMinutes, чтобы упростить начальные 10 минут назад, и если вы фильтруете только по предложению Where, я бы использовал точечную запись.

После всех этих изменений (и повышения полезности имен переменных) код будет выглядеть следующим образом:

DateTime tenMinutesAgo = DateTime.Now.AddMinutes(-10);

var entriesToDelete = cpuInfo.Where(entry => entry.DateTime <= tenMinutesAgo);

foreach (var entry in entriesToDelete)
{
    localDB.TblCPUInfo.DeleteOnSubmit(entry);
}
localDB.SubmitChanges();

Теперь, почему <= не работает для вас ... возможно ли, что вам нужно время UTC вместо местного времени? Например: </p>

DateTime tenMinutesAgo = DateTime.UtcNow.AddMinutes(-10);

Если это все еще не работает, я предлагаю вам взглянуть на сгенерированный запрос и поиграть с ним в инструменте SQL (например, Enterprise Manager или SQL Server Management Studio), чтобы выяснить, почему он не возвращает никаких результатов.

3 голосов
/ 19 июля 2009

DefaultIfEmpty вернет один элемент с предоставленным вами содержимым, так что в вашем случае это коллекция с одним значением «null».

Вы должны проверить элементы в коллекции, используя метод расширения Any (). В вашем случае:

DateTime dateTime = DateTime.Now.Subtract(new TimeSpan(0, 0, 10, 0));

var result1 = from a in cpuInfo
                  where a.DateTime <= dateTime
                  select a;

if (result1.Any())
{            
    foreach (TblCPUInfo record1 in result1)
    {
            localDB.TblCPUInfo.DeleteOnSubmit(record1);
            localDB.SubmitChanges();
    }
}

Но если это действительно ваш код, вы можете полностью пропустить проверку Any (), потому что цикл foreach не будет выполняться, если в result1 нет элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...