Как выполнить оператор условия в LINQ на основе переменных кода?

#c# #linq

#c# #linq

Вопрос:

Я понял, что по какой-то странной причине вы не можете связать .Где() после .Select(), поэтому я придумал это.

 var eventCalendar = db.EventCalendars.Where(q => q.Date == e.Day.Date);

if (!isLogged)
{
    eventCalendar = eventCalendar.Where(q => q.ClientFlag == true);
}
eventCalendar = eventCalendar.Select(q => q.EnvironmentId).Distinct();
 

но теперь я получаю и ошибку в .Выберите

 "Cannot implicitly convert type 'System.Linq.IQueryable<short>' to 'System.Linq.IQueryable<IT_Portal.EventCalendar>'. An explicit conversion exists (are you missing a cast?)"
 

Что я делаю не так? Проще говоря, я просто хочу иметь возможность получать отдельный идентификатор среды из таблицы событий календаря, чтобы я мог уведомлять пользователей, если в этот день в определенной среде происходит событие. Наконец, если пользователь не вошел в систему, получите только идентификатор среды из событий, которые помечены для отображения для клиента (ClientFlag).

Ответ №1:

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

 var eventCalendarEnvironmentIds = 
    eventCalendar.Select(q => q.EnvironmentId).Distinct();
 

Ответ №2:

Вам нужна новая переменная.

 var environmentIDs = eventCalendar.Select(q => q.EnvironmentId).Distinct();
 

Ответ №3:

Выбрав Select(q => q.EnvironmentId), вы фактически выбираете EnvironmentId, а не eventCalenderObject .

Ответ №4:

Попробуйте изменить:

 var eventCalendar = db.EventCalendars.Where(q => q.Date == e.Day.Date);
 

Для:

  // I specify IQueryable, you can use 'var' - you simply need to change the variable name
IQueryable eventQuery = db.EventCalendars.Where(q => q.Date == e.Day.Date);
 

Затем, выбрав:

 var eventCalendar = eventQuery.Select(q => q.EnvironmentId).Distinct();
 

Иногда, когда вы продолжаете использовать var , вы можете потерять из виду тип данных. Вы должны использовать фактический тип данных как можно чаще. Попадание в ловушку использования var — не очень хорошая практика, ИМО.