2010-02-05 3 views
0

J'essaie d'exécuter le code suivant. Mais le code casseLinqToSql - Bit d'un comportement étrange

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 est une propriété de type chaîne. Maintenant, je testé cette ligne de code en dehors de la déclaration LINQ de la manière suivante et il a bien fonctionné, retourné le bon résultat que j'attendais

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

Quelqu'un pourrait-il s'il vous plaît me aider à comprendre pourquoi le code dans les premières ruptures de bloc. qu'est-ce qui ne va pas là-bas?

Voici le message qui revient (aide-moi donner un sens à ce sujet)

Impossible de traduire l'expression « Tableau (plainte) .Select (comp => new 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 = invoquer (valeur (System.Func 1[System.Linq.IQueryable 1 [Data.ItemPropertyVariation]])). WithVariationId (($ VB $ It1.comp.ItemPropertyYVariationId ?? 0)))). Sélectionnez ($ VB $ It => new Complaint() {ItemXVariation = IIF ((Convert ($ VB $ It. $ VB $ It1.varX) = null), null, $ VB $ It. $ VB $ It1. varX.Name)}) ' dans SQL et ne pouvait pas le traiter comme une expression locale.

+0

Supprimer autant de votre code que possible, mais en laissant assez que le problème persiste et modifier votre message en conséquence. – jason

Répondre

1

Est GetVariations() une méthode de votre choix. linq to sql va essayer de l'appeler comme une procédure stockée.

Vous auriez besoin d'écrire une procédure stockée ou d'obtenir le jeu d'entités complet puis d'utiliser linq (pour les objets) avec vos instructions "let". Cela s'appellerait votre GetVariations()

+0

Oui David, GetVariations() est ma propre fonction et renvoie un IQueryable de type personnalisé. Le coupable dans toute cette débâcle semble être Si (varX est rien, DirectCast (String.Empty, String), varX.Name) qui se traduit par IIF ((Convert ($ VB $ It. $ VB $ It1.varX) = null), null, $ VB $ It. $ VB $ It1.varX.Name Lorsque j'utilise la même instruction if en dehors de la requête linq, cela marche absolument bien, seulement dans linq query, ça explose – Xience

1

C'est un malentendu commun que vous seriez capable d'utiliser n'importe quoi contre IQueryable, et qu'il soit simplement 'traduit par magie'. Ce n'est pas le cas.

Le problème est que vous utilisez du code que le fournisseur Linq2SQL Linq ne prend pas en charge. En termes simples, Linq fonctionne en interprétant l'arbre d'expression défini dans votre requête dans sa langue cible (dans le cas de Linq2Sql, T-SQL). Il ne peut pas simplement traduire n'importe quel appel de méthode dans le sql approprié ...

Donc, en utilisant linq2sql (ou tout autre fournisseur linq d'ailleurs), vous devez savoir quels opérateurs de requête sont supportés, et comment.

Pour une analyse plus approfondie des explications sur la traduction Sql, check out this blog post

+0

jeroenh je comprends votre point Mais dans mon cas, l'appel de méthode se traduit très bien, c'est ".ItemXVariation = If (varX est Nothing, DirectCast (String.Empty, String), varX.Name)" qui rompt l'exécution .ItemXVariation est une propriété de string Tout ce que je veux faire ici est de vérifier si l'objet varX n'est rien, puis retourner une chaîne vide, sinon retourner la valeur dans varX.Name à .itemXVariation.La chose étrange est que si je teste la même ligne en dehors de l'instruction LINQ, fonctionne, mais pas à l'intérieur de la déclaration. – Xience