2010-02-05 2 views
0

Я пытаюсь запустить следующий код. Но код разрываLinqToSql - Немного странное поведение

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

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

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

Не удалось перевести выражение «Table (Жалоба) .Select (комп => новый 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 $ It. $ VB $ It1.varX) = null), null, $ VB $ It. $ VB $ It1. varX.Name)}) ' в SQL и не может рассматривать его как локальное выражение.

+0

Удалить столько кода, как это возможно, но оставляя достаточно того, что проблема продолжает возникать и редактировать свой пост, соответственно. – jason

ответ

1

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

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

+0

Да David, GetVariations() - моя собственная функция и возвращает IQueryable пользовательского типа. Претендент во всем этом фиаско кажется Если (varX Is Nothing, DirectCast (String.Empty, String), varX.Name), который переводится в IIF ((Конвертировать ($ VB $ It. $ VB $ It1.varX) = null), null, $ VB $ It. $ VB $ It1.varX.Name Когда я использую тот же оператор if вне запроса linq, он работает абсолютно нормально, только внутри запроса linq, он взрывается – Xience

1

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

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

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

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

Для более глубокого объяснения о переводе на Sql, check out this blog post

+0

jeroenh Я понимаю вашу точку Но в моем случае вызов метода переводится абсолютно точно: «.ItemXVariation = If (varX Is Nothing, DirectCast (String.Empty, String), varX.Name)», который прерывает выполнение .ItemXVariation - это свойство строки и все, что я хочу сделать здесь, это проверить, нет ли объекта varX, а затем вернуть пустую строку, в противном случае вернуть значение в varX.Name в .itemXVariation. Странно, если я тестирую ту же строку за пределами оператора LINQ, работает, но не внутри высказывания. – Xience

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