2009-07-20 4 views
2

Как преобразовать этот запрос из SQL в Linq:Sql запросов к Linq

SELECT status As 'Status', 
     count(status) As 'Count' 
FROM tbl_repair_order 
WHERE contract = 'con' and 
     (status = 'Parts Arr' or 
     status = 'NA' or 
     status = 'New Call' or 
     status = 'Parts Ord' or 
     status = 'Parts Req' or 
     status = 'F Work') 
GROUP BY status 

Update

Спасибо Ребята, это код, который я использовал. Испытано и возвращает то же самое, что и выше:

 List<string> statuses = new List<string> { "Parts Arr", "NA", "New Call", "Parts Ord", "Parts Req", "F Work"}; 

     var result = (from x in db.tbl_repair_orders 
        where x.CONTRACT == strContract 
         && statuses.Contains(x.STATUS) 
        group x.STATUS by x.STATUS into grouping 
        select new { Status = grouping.Key, Count = grouping.Count() }); 

     return result; 
+0

Я думаю, что вы должны прислушаться к предупреждению Иона во второй точке его ответа. – AndyMcKenna

+1

На самом деле вызов '.Contains()' правильно переводит на LinqToSql (и, возможно, на EF) - http://blog.wekeroad.com/2008/02/27/creating-in-queries-with- linq-to-sql/ –

+0

После прочтения этой ссылки стоит также отметить, что использование массива вместо List приведет к генерации инструкции IN. – AndyMcKenna

ответ

4
string[] statuses = new string[] { "Parts Arr", "NA", "New Call", "Parts Ord", "Parts Req", "F Work" }; 
    var x = (from ro in db.tbl_repair_order 
      where ro.contract == "con" 
       && statuses.Contains(ro.status) 
      group 0 by ro.status into grouping 
      select new { Status = grouping.Key, Count = grouping.Count() }); 

Я не знаю, если синтаксис правильно (особенно последние две строки), но это должно быть довольно близко.

Я добавил 0 между группой и на основе исправления Eamon Nerbonne в комментариях. Кроме того, благодаря Ryan Versaw для ссылки, объясняющей List и массивы для генерации предложений IN.

+1

Это должно быть 'grouping.Key' - кроме того, я думаю, что это выглядит правильно. –

+1

Основное отличие, которое у меня было в моей версии (достаточно похоже, что я не отправляю новый ответ) - использовать список. 'Список statuses = new Список {" Parts Arr "," NA "," New Call "," Parts Ord "," Parts Req "," F Work "};' Затем измените условия, в которых: 'ro.contract =" con "&& statuses.Contains (ro.status)' –

+0

@Ryan, спасибо за подсказку Key, я также заметил, что после его публикации. – AndyMcKenna

2

Предполагая, что вы телеграфировать вашей таблицы соответственно, что-то вроде

var statusCounts = 
    from row in youDbNameHere.tbl_repair_order 
    where row.contract == "con" 
     && (row.status == "Parts Arr" 
     || row.status == "NA" 
     || row.status == "New Call" 
     || row.status == "Parts Ord" 
     || row.status == "Parts Req" 
     || row.status == "F Work") 
    group 0 by row.status into g 
    select new { Status = g.Key, StatusCount = g.Count() }; 

... и я вижу Энди бить меня это ;-)

Примечания:

  • Вам нужно включают выражение между «группой» и «по», это выражение будет оцениваться для формирования набора значений, доступных под ключом группы (в вашем случае это не имеет значения, поэтому нуль в порядке).
  • Если вы хотите использовать Linq-to-Sql или Linq-to-Entities (или какую-либо другую реализацию IQueryable), имейте в виду, что ваш код не будет выполняться непосредственно на C#, а скорее будет переведен (как и должно быть) в sql - поэтому избегайте использования особых вызовов .NET, которые не могут быть переведены, поскольку они обычно вызывают исключение во время выполнения или (редко) заставляют результирующий запрос быть частично оцененным на стороне клиента (при потенциально высокой производительности).
-1

Как можно преобразовать операторы SQL в эквивалентные выражения Linq to SQL, вы должны проверить инструмент Linqer, который делает именно это. Я не думаю, что это приложение полезно использовать для повторного написания всего вашего приложения, но оно может быть очень полезным инструментом для обучения Linq для SQL в целом.

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