LINQ to Entities, условный оператор where - PullRequest
0 голосов
/ 21 августа 2011

У меня есть следующий запрос, который работает нормально. Однако это не работает в запросе соединения, где это необходимо.

var ra = from c in _context.Wxlogs
         select c;

if (year == "2011")
{
    ra = (IQueryable<Wxlog>)(from c in _context.Wxlogs
                             where c.LogYear == year 
                                   && (SqlFunctions.DatePart("Month", c.LogDate2) == m3) 
                                   && c.LogTime.Contains("23:59")
                             orderby c.LogDate2
                             let LogDate = c.LogDate2
                             select new { 
                                 LogDate, 
                                 c.Rain_today 
                             });
}
else if (year != "2011")
{
    ra = (IQueryable<Wxlog>)(from c in _context.Wxlogs
                             where c.LogYear == year 
                             && c.LogMonth == mm 
                             && c.LogTime.Contains("08:59")
                             orderby c.LogDate2
                             let LogDate = EntityFunctions.AddDays(c.LogDate2, -1)
                             select new { 
                                 LogDate, 
                                 c.Rain_today 
                             });
}

Следовательно, я безуспешно пытался внедрить остальные условия ( что-то вроде этого ответа от Whaheed ).

Любая помощь будет оценена.

Ответы [ 3 ]

4 голосов
/ 21 августа 2011

Вы можете использовать var с условным оператором:

var query = year == "2011" ?
                 from c in _context.Wxlogs
                 where c.LogYear == year 
                 && (SqlFunctions.DatePart("Month", c.LogDate2) == m3) 
                 && c.LogTime.Contains("23:59")
                 orderby c.LogDate2
                 let LogDate = c.LogDate2
                 select new { 
                     LogDate, 
                     c.Rain_today 
                 });
// Second part of conditional
               : from c in _context.Wxlogs
                 where c.LogYear == year 
                 && c.LogMonth == mm 
                 && c.LogTime.Contains("08:59")
                 orderby c.LogDate2
                 let LogDate = EntityFunctions.AddDays(c.LogDate2, -1)
                 select new { 
                     LogDate, 
                     c.Rain_today 
                 });

Это не идеально, но так как вы также меняете бит "LogDate" в зависимости от года, это, вероятно, самый простой подход - два запроса отличаются слишком большим количеством мест для извлечения в нормальный способ. (Это не так, как если бы вы на самом деле только что получили условное предложение «где», как подсказывает ваш заголовок.)

Причина, по которой вам нужно var, заключается в том, что вы проецируете на анонимный тип. Если вы этого не делаете, вы можете использовать блок if / else. Есть еще способы, которыми вы можете сделать это, но это немного болезненно.

1 голос
/ 21 августа 2011

попробуй (РЕДАКТИРОВАТЬ после комментария):

if (year == "2011")
{
ra = (from c in _context.Wxlogs
      where c.LogYear == year && 
            && (SqlFunctions.DatePart("Month", c.LogDate2) == m3) 
            && c.LogTime.Contains("23:59") 
            orderby c.LogDate2
            let LogDate = EntityFunctions.AddDays(c.LogDate2, year == "2011" ? 0 : -1)
            select new { 
                        LogDate, 
                        c.Rain_today 
                        }).AsQueryable();
}
else if (year != "2011")
{
ra = (from c in _context.Wxlogs
      where c.LogYear == year && 
            && c.LogMonth == mm 
            && c.LogTime.Contains("08:59")
            orderby c.LogDate2
            let LogDate = EntityFunctions.AddDays(c.LogDate2, year == "2011" ? 0 : -1)
            select new { 
                        LogDate, 
                        c.Rain_today 
                        }).AsQueryable();
}
1 голос
/ 21 августа 2011

Вы не можете привести new { LogDate, c.Rain_today } к Wxlog, вам нужно вернуть select c из обоих запросов.

Если вы хотите выбрать только ту часть, которую сможете после последней else, введите следующую команду:

var ra2 = from r in ra
          select new {
              LogDate, 
              c.Rain_today 
          };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...