2016-12-16 3 views
3

Я пытаюсь написать запрос в контроллер, похожий на то, что у меня есть в моей SQL хранимой процедуры:Правильное использование Select() и где() в одном операторе

Select * FROM TableName Where aDate >= beginDate and aDate <= endDate 

В мой контроллер, я объявили 2 переменные, которые будут получать входные значения из моего просмотра файла:

DateTime? startDate = input.BeginDateInput; 
DateTime? endDate = input.EndDateInput; 

и переменной д, которая принимает значения из БД

var q = db.tblName.AsQueryable(); 

В настоящее время у меня есть Выбор на основе таблицы всех значений, глядя, как следующее:

var data = q.Select(
    p => 
    new 
    { 
     //... 
     WarrantyExpDate = p.WarrantyExpDate.ToShortDateString(), 
     //... 
    }); 

Когда я пытаюсь добавить .гд() в конце

Select(...).Where(DateTime.Compare(Convert.ToDateTime(WarrantyExpDate), (DateTime)startDate)>0) 

(укоротить для время), я получаю сообщение об ошибке WarrantyExpDate was not in the current context. Проведя некоторое исследование, я попытался воссоздать предложение от that thread для подкачки select и где, но он возвращал ту же проблему.

Может ли кто-нибудь указать мне в правильном направлении на то, что я делаю неправильно? Как сделать так, чтобы и Select, и Where распознавали одну и ту же переменную?

+3

'Where' требует делегата, который обычно принимает форму лямбда-выражения. В вашем случае, скорее как '.Where (n => DateTime.Compare (Convert.ToDateTime (n.WarrantyExpDate) ...' –

+0

@BJMyers Я выполнил предлагаемые быстрые исправления, и, похоже, эта ошибка устранена. вы забудете даже такие основы. Я дам вам знать завтра о результатах после того, как я его испытаю. –

ответ

3

Как указывает BJ, если вы используете синтаксис лямбда, вам нужно предоставить выражение лямбда методу Where. Что-то, как это будет, вероятно, работать:

var data = q 
.Where(p => p.WarrantyExpDate < startDate) 
.Select(
    p => 
    new 
    { 
     //... 
     WarrantyExpDate = p.WarrantyExpDate.ToShortDateString(), 
     //... 
    }); 

Обратите внимание, что я кладу в пункт Where первый. Это позволяет выполнять запрос по исходным данным, а не преобразовывать его в строку и обратно. Это часто, но не всегда, более желательно. Иногда ваш Select выполняет большую работу, чтобы получить определенную информацию, и вы не хотите повторять эту логику в предложении Where. Самое приятное в LINQ - это то, что вы выбираете, что проще всего.

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

var data = 
    from p in q 
    where p.WarrantyExpDate < startDate 
    select new 
    { 
    //... 
    WarrantyExpDate = p.WarrantyExpDate.ToShortDateString(), 
    //... 
    }; 
+0

Я собираюсь уйти, но я обязательно буду обещать ваши первые предложения завтра утром, спасибо! –

Смежные вопросы