Запрос данных LINQ C # захватывает нижний элемент базы данных и проверяет его - PullRequest
2 голосов
/ 16 марта 2011

мой код
Мне нужно захватить нижнюю (самую последнюю) запись в моей базе данных и посмотреть, было ли это более 1 часа назад, тип ObservationTime - DateTime.Я получаю сообщение об ошибке, в котором говорится, что «Sequence содержит более одного элемента» для моего var mWeathers.Я думаю, что это связано с тем, как я опускаюсь, но я не могу понять это.Спасибо

    [OperationContract]
    public bool LeastOneHour()
    {

        DataClassesDBDataContext db = new DataClassesDBDataContext();
        var mWeathers = (from weathertable in db.WeatherTables 
                         orderby weathertable.ObservationTime descending 
                         select weathertable.ObservationTime).Single();
        DateTime lastTime = Convert.ToDateTime(mWeathers).AddHours(1);
        if ( lastTime <= DateTime.Now)
            return true;
        else
            return false;
    }

Ответы [ 3 ]

4 голосов
/ 16 марта 2011

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

var mWeathers = (from weathertable in db.WeatherTables 
                 orderby weathertable.ObservationTime descending 
                 select weathertable.ObservationTime).First();

Или, если есть вероятность, что запросне даст результатов, вы должны использовать FirstOrDefault():

var mWeathers = (from weathertable in db.WeatherTables 
                 orderby weathertable.ObservationTime descending 
                 select weathertable.ObservationTime).FirstOrDefault();

И если вы не против внесения каких-либо других изменений, вы можете сделать свой код чище и менее многословным:

var mWeathers = db.WeatherTables
                  .OrderByDescending(w => w.ObservationTime)
                  .First(); // or FirstOrDefault()

return Convert.ToDateTime(mWeathers).AddHours(1) <= DateTime.Now;         
4 голосов
/ 16 марта 2011

Как и другие (совершенно правильные) ответы, которые вы уже дали, вы можете рассмотреть:

DateTime lastTime = db.WeatherTables.Max(table => table.ObservationTime);

или

DateTime? lastTime = db.WeatherTables.Max<DateTime?>(t => t.ObservationTime);

Последняя форма может справиться с пустой таблицей (где первая не справится). Это было бы хорошо в LINQ to Objects, но я всегда стесняюсь сказать, что что-то будет работать в LINQ to SQL без предварительной попытки:)

3 голосов
/ 16 марта 2011

Single() говорит, что должен быть одним элементом в результате, и, если их более одного, выдается исключение.Вероятно, вы ищете First() или FirstOrDefault(), если есть вероятность, что вообще не будет результатов (в этом случае возвращается ноль)

Если вы можете быть уверены, что всегда будетбыть элементом, попробуйте это:

DateTime lastDate = db.WeatherTables.OrderByDescending (w => w.ObservationTime).Select(w => w.ObservationTime).First();

return lastDate.AddHours(1) <= DateTime.Now;

В противном случае что-то вроде

DateTime? lastDate = db.WeatherTables.OrderByDescending (w => w.ObservationTime).Select(w => w.ObservationTime).FirstOrDefault();

return lastDate.HasValue ? lastDate.AddHours(1) <= DateTime.Now : false;

Если конечно ObservationDate объявлен как DateTime?

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