Sql Query to Linq - PullRequest
       10

Sql Query to Linq

2 голосов
/ 20 июля 2009

Как бы я преобразовал этот запрос из 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

Обновление

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

        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;

Ответы [ 3 ]

4 голосов
/ 20 июля 2009
    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 между группой и на основе поправки Иамона Нербонна в комментариях. Также спасибо Райану Верзоу за ссылку, объясняющую List и массивы для генерации предложений IN.

2 голосов
/ 20 июля 2009

Если вы правильно подключили свой стол, что-то вроде

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

... и я вижу, как Энди побил меня; -)

Примечания:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...