2009-07-24 7 views
3

J'ai un problème avec l'API Dynamic Expression. Je n'arrive pas à comparer un champ DataTable à DBNull.Value. L'API est supposée être capable de "supporter le champ statique ou l'accès aux propriétés statiques, tout champ public ou propriété est accessible". Toutefois, étant donné la requête suivante:API d'expression dynamique LINQ, prédicat avec comparaison DBNull.Value

var whatever = table1.AsEnumerable() 
        .Join(table2.AsEnumerable(), 
        (x) => x.Field<int>("Table1_ID"), 
        (y) => y.Field<int>("Table2_ID"), 
        (x, y) => new { x, y}) 
        .AsQueryable() 
        .Where("x[\"NullableIntColumnName\"] == DBNull.Value"); 

je finis par obtenir l'erreur: « Pas de propriété ou un champ « DBNull » existe dans le type « <> f__AnonymousType0`2 » »

Quelqu'un a des idées sur la façon d'obtenir autour de ça? Je ne peux pas utiliser Submission.Field ("NullableIntColumnName") dans la chaîne passée à la méthode Where, btw, ou bien je serais capable de comparer avec null au lieu de DBNull.Value.

Répondre

3

Eh bien, j'ai enfin compris. cptScarlet l'avait presque.

var values = new object[] { DBNull.Value };  
... 
.Where("x[\"NullableIntColumnName\"] == @0", values); 

ou

.Where("x[\"NullableIntColumnName\"] == @0", DBNull.Value); 
+0

Cette solution ne fonctionne pas pour moi car j'utilise une partie Select personnalisée. Si vous utilisez un objet personnalisé comme un objet DTO dans la partie Sélection, le type de colonne sera également nullable. – ahmet

1

Que se passe lorsque vous remplacez votre .Lorsque actuel avec quelque chose comme

.Where(string.format("x[\"NullableIntColumnName\"] == {0}",DBNull.Value)); 
+0

extrêmement improbable au travail - {0} sera remplacé par null, comme c'est waht donne DBNull.Value.ToString() –

+0

Précision: Dynamic Linq a son propre analyseur qui va interpréter la chaîne passée à Où en l'analysant comme une expression de chaîne –

+0

Merci cptScarlet ... dès que j'ai vu votre réponse, je me suis souvenu de la surcharge Où prend une chaîne et un objet params [] ensemble. –

0

Désolé de non-réponse avec une USL, mais ...

Avez-vous regardé dans la source? Il n'y en a pas beaucoup. Ma conjecture est que DBNull n'est pas dans la liste des objets root enregistrés.

Je n'ai pas la source à portée de main pour le moment, mais il est également susceptible de vous dire à quoi pourraient ressembler d'autres constantes.

0

.Where (a => a.IntColName == NULL);

Edit:

Désolé, je did't cette exigence soit dynamique ... dynamique serait: (au moins dans le cadre 4)

var intColName = "..."; 
    .Where(string.Format("it.{0} is null", intColName)); 
+0

Non, je ne pouvais pas faire cela, le choix de la colonne est dynamique, basé sur l'entrée de l'utilisateur. –

1

Si vous changez x.Field<int>("Table1_ID") à x.Field<int?>("Table1_ID") vous » ll obtiendra des entiers nullables au lieu des entiers réguliers, et toutes les valeurs DBNull seront converties en valeurs nulles C# simples. Basé simplement sur votre extrait de code, je ne suis même pas sûr que vous auriez besoin d'expressions dynamiques - un simple .Where(foo => foo.x == null) devrait fonctionner.

+0

J'ai vraiment besoin d'expressions dynamiques, mais point à propos de l'utilisation int? pour le paramètre de type. –

1

En général, vous pouvez aussi essayer:

.Where("NullableColumnName.HasValue");