LinqToSql - немного странного поведения - PullRequest
0 голосов
/ 05 февраля 2010

Я пытаюсь запустить следующий код. Но код ломается

    Dim complaints = From comp In Me.Db.Complaints _
    Let varX = GetVariations().WithVariationId(If(comp.ItemPropertyXVariationId, 0)) _
    Let varY = GetVariations().WithVariationId(If(comp.ItemPropertyYVariationId, 0)) _
    Select New Hogia.Retail.POS.Data.Complaint() With _
    {.ItemXVariation = If(varX Is Nothing, DirectCast(String.Empty, String), varX.Name)}

.ItemXVariation является свойством строкового типа. Теперь я протестировал эту строку кода вне оператора LINQ следующим образом, и он работал нормально, вернул правильный результат, как я ожидал

    Dim varXX = GetVariations().WithVariationId(0)
    Dim varYY = GetVariations().WithVariationId(0)
    Dim temp As New Complaint() With {.ItemXVariation = If(varXX Is Nothing, DirectCast(String.Empty, String), varXX.Name)}

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

Вот сообщение, которое появляется (помогите мне разобраться в этом)

Не удалось перевести выражение 'Таблица (жалоба). Выберите (comp => новый VB $ AnonymousType_2 2 (comp = comp, varX = Invoke(value(System.Func 1 [System.Linq.IQueryable 1[ Data.ItemPropertyVariation]])).WithVariationId((comp.ItemPropertyXVariationId ?? 0)))).Select($VB$It1 => new VB$AnonymousType_3 2 ($ VB $ It1 = $ VB $ It1, varY = Invoke (значение (System.Func 1[System.Linq.IQueryable 1 [Data.ItemPropertyVariation]])). WithVariationId (($ VB $ It1.comp.ItemPropertyYVariationId ?? 0)))). Выберите ($ VB $ It => новая жалоба () {ItemXVariation = IIF ((Преобразовать ($ VB $ Ит. $ VB $ It1.varX) = ноль), ноль, $ VB $ Ит. $ VB $ It1.varX.Name)}) ' в SQL и не может обрабатывать его как локальное выражение.

Ответы [ 2 ]

1 голос
/ 06 февраля 2010

Это распространенное заблуждение, что вы сможете использовать что-либо против IQueryable и что оно просто «волшебным образом» переводится. Это не тот случай.

Проблема в том, что вы используете код, который не поддерживается провайдером Linq2SQL Linq.

Проще говоря, Linq работает путем интерпретации дерева выражений, определенного в вашем запросе, на его целевой язык (в случае Linq2Sql, T-SQL). Он не может просто перевести любой вызов метода в соответствующий sql ...

Таким образом, при использовании linq2sql (или любого другого поставщика linq в этом отношении) вы должны знать, какие операторы запросов поддерживаются и как.

Для более подробного объяснения перевода на Sql, ознакомьтесь с этим постом в блоге

1 голос
/ 05 февраля 2010

Является ли GetVariations () вашим собственным методом. linq to sql будет пытаться вызвать его как хранимую процедуру.

Вам нужно будет либо написать хранимую процедуру, либо получить полный набор сущностей, а затем использовать linq (для объектов) с вашими операторами let. Это будет называть ваши GetVariations ()

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