Возникают проблемы с преобразованием условного оператора where в LINQ обратно в SQL - PullRequest
1 голос
/ 08 сентября 2010

Я немного рассол!

Я сделал шикарное выражение LINQ, которое выполняет работу в моем веб-приложении, но теперь я хотел бы использовать это в хранимой процедуре:

var r = (from p in getautocompleteweightsproducts.tblWeights
                     where p.MemberId == memberid &&
                              p.LocationId == locationid

                     select p);

            if (level != "0")
                r = r.Where(p => p.MaterialLevel == level);

            if (column == "UnitUserField1")
                r = r.Where(p => p.UnitUserField1 == acitem);

            if (column == "UnitUserField2")
                r = r.Where(p => p.UnitUserField2 == acitem);

return r.OrderBy(p => p.LevelNo).ToList();

Тем не менее, я не могу на всю жизнь получить условную оговорку о том, где работать !!

Если кто-то может указать мне правильное направление, я был бы очень признателен.

С уважением

Ответы [ 3 ]

1 голос
/ 08 сентября 2010

Может как то так?

SELECT *
FROM dbo.weights
WHERE member_id = @memberid
    AND location_id = @locationid
    AND material_level = CASE WHEN @level = '0' THEN material_level
                              ELSE @level END
    AND @acitem = CASE @column WHEN 'UnitUserField1' THEN unit_user_field_1
                               WHEN 'UnitUserField2' THEN unit_user_field_2
                               ELSE @acitem END
ORDER BY level_no
1 голос
/ 08 сентября 2010

Вы пробовали LinqPAD , я уверен, что в прошлый раз, когда я играл, вы могли ввести код "LINQ to SQL" и увидеть полученный SQL-запрос. В противном случае поместите трассировку / профилировщик SQL в свой код, работающий на LinqTOSQL, и найдите в трассировке выполняемый запрос.

0 голосов
/ 08 сентября 2010

Ответ LukeH даст вам правильные строки, но что-то теряется, когда вы пытаетесь заменить машину, генерирующую запрос, одним запросом.Есть части этого запроса, которые непрозрачны для оптимизатора.

Если вам нужны исходные запросы, как если бы они были сгенерированы по linq, есть две опции.

  • Генерация каждого возможного запроса и элемента управления, выполняемого IF ELSE.
  • Использование Dynamic sql для построения каждого запроса (хотя при этом устраняются многие преимущества использования хранимой процедуры).

Если вы решите использовать динамический sql, вы должны знать о проклятии и благословениях .

...