2010-08-24 8 views
1

J'utilise VS2010, Entity Framework 4.0 et Advantage v. 10 dans mon application. J'ai écrit une instruction Linq-to-Entities (L2E) qui essaie de convertir un type numérique (décimal) Nullable en un nombre décimal. Une simple déclaration pourrait ressembler à:framework d'entité + base de données d'avantages: conversion de types numériques nullables

var x = (from test in entities.Tests 
     select test.ValueA.HasValue ? test.ValueA.Value : 0); 

Cependant, je reçois l'erreur suivante:

System.Data.EntityCommandExecutionException: Une erreur est survenue lors de l'exécution de la définition de la commande. Voir l'exception interne pour plus de détails. ---> Advantage.Data.Provider.AdsException: Erreur 7200: Erreur AQE: State = S0000; NativeError = 2159; [Solutions iAnywhere] [Moteur SQL Advantage] Argument invalide de la fonction scalaire: CAST - doit spécifier à la fois la précision et l'échelle. - L'emplacement de l'erreur dans l'instruction SQL est: xxx (ligne: x colonne: x) L'exécution de la requête AdsCommand a échoué.

Existe-t-il un moyen d'énumérer les résultats et d'effectuer la conversion côté client? Je ne suis pas sûr de savoir comment dire à Advantage la précision et l'échelle de "0" à travers l'énoncé L2E.

Merci d'avance.

+0

cette conversion ne fonctionne pas. Cependant avez-vous essayé quelque chose comme. select test.Valeur ?? 0 Il se peut que je manque un casting quelque part, mais si vous pouvez le traduire, cela pourrait faire l'affaire. Parfois, changer la syntaxe permet de faire avancer les choses. – zeeshanhirani

+0

zeeshanhirani, oui, j'ai essayé le ?? syntaxe. Malheureusement, cela n'a pas fonctionné. L'utilisation de la fonction IsNull proposée par LanceSc est une solution de contournement viable. Merci quand même! – user429994

Répondre

1

Comme mentionné Craig ce bogue dans le fournisseur Avantage Entity Framework. Il sera corrigé dans la prochaine version de service du fournisseur d'infrastructure Advantage Entity.

Un autre travail possible serait d'exposer la fonction IsNULL de la base de données. Ajoutez ce qui suit au SSDL.

<Function Name="IsNull" ReturnType="numeric" Aggregate="false" BuiltIn="true" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion"> 
    <Parameter Name="Value" Type="numeric" Mode="In"/> 
    <Parameter Name="Default" Type="integer" Mode="In"/> 
</Function> 

Ajoutez ensuite la fonction de remplacement CLR suivante.

public static class MyFunctions 
    { 

    [EdmFunction("Model.Store", "IsNull")] 
    public static decimal IsNull(decimal? Value, int? Default) 
     { 
     throw new InvalidOperationException("Call from within an L2E query"); 
     } 
    } 
+0

Merci, LanceSc. Cela a fonctionné parfaitement. – user429994

0

Votre fournisseur EF a généré un code SQL incorrect, ce qui constitue un problème pour le fournisseur.

Cependant, vous pouvez probablement travailler autour:

var x = entities.Tests 
       .Select(t => t.ValueA) 
       .AsEnumerable() 
       .Select(t => t.GetValueOrDefault());