webBG - програмисти, машинно обучение, javascript, python, php, питам, говорим, публикации

LINQ to Entities условна клауза where

Имам следната заявка, която работи добре. Въпреки това не работи в заявка за присъединяване, където е необходимо.

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 
                             });
}

Затова се опитвах да вградя условията else if ( нещо като този отговор от Whaheed ) без никакъв късмет.

Всяка помощ ще бъде оценена.

21.08.2011

  • Не работи как? Не ви дава данните, които очаквате, извежда грешка или? 21.08.2011
  • Съединението дава следната грешка: Типът на един от изразите в клаузата за свързване е неправилен. Извеждането на типа е неуспешно при извикването на „Присъединяване“. 21.08.2011

Отговори:


1

Можете да използвате 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. Все още има начини, по които можете да направите това, но е малко болезнено.

21.08.2011
  • Благодаря много за това. Накарах първата част да работи с малко форматиране. Оценявам го. Винаги се борете и за подходящо заглавие :-) 21.08.2011

  • 2

    Не можете да прехвърлите new { LogDate, c.Rain_today } към Wxlog, трябва да върнете select c от двете заявки.

    Ако искате да изберете само тази част, можете след последното else да въведете следното

    var ra2 = from r in ra
              select new {
                  LogDate, 
                  c.Rain_today 
              };
    
    21.08.2011

    3

    опитайте (РЕДАКТИРАНЕ след коментар):

    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();
    }
    
    21.08.2011
  • Благодаря за това, но получавам двусмислена грешка при извикване на клаузата Where 21.08.2011
  • не мога да се меря с Джон, предполагам :-) 21.08.2011
  • Нови материали

    Electron с база данни Sqlite3
    Electron е рамка за изграждане на междуплатформени настолни приложения с HTML, CSS JavaScript. Electron е написан на C++, Javascript, Objective C, Python и т.н. Днес Electron е супер готин и..

    Системи за препоръчване в машинното обучение
    Какво представляват двигателите за препоръки? Това е най-мощното и полезно приложение на технологията за машинно обучение в бизнеса. Тези дни. Днес всеки голям гигант като Google, Amazon,..

    Топ 5 Python IDE / текстови редактори
    Какви IDE на Python трябва да гледам? 1. Pycharm Традиционният пълноценен редактор за Python от JetBrains. PyCharm предоставя широк набор от основни инструменти, тясно интегрирани за..

    Извличане на данни от API — част 2
    Научете как можете да филтрирате филми въз основа на различни категории. Моля, вижте предишния урок (Част 1) : Как да извличам данни от истински API — React / JS..

    Как да предотвратите влизането на някой от вашата кодова база
    // TLDR TypeScript добавя статично въвеждане към JavaScript, улавяйки грешки като препращане към променливи извън обхвата или извикване на функции с грешни аргументи. Той е несъвършен и има..

    Анализ на настроението с помощта на логистична регресия и наивен Бейс
    Нека сравним кой алгоритъм е по-добър за класифициране на туитовете въз основа на техните чувства. Наблюдаван ML При контролираното машинно обучение обикновено имате вход X, който влиза във..

    Нови тенденции в AI и спорта
    Изкуственият интелект е авангардна технология, която дава възможност на машините да изпълняват задачи, които обикновено изискват човешки интелект, като вземане на решения, разпознаване на реч и..