2009-07-24 7 views
3

Ich habe ein Problem mit der Dynamic Expression API. Ich kann nicht scheinen, ein DataTable-Feld mit DBNull.Value zu vergleichen. Die API soll "den Zugriff auf statische Felder oder statische Eigenschaften unterstützen. Auf jedes öffentliche Feld oder jede öffentliche Eigenschaft kann zugegriffen werden." Doch die folgende Abfrage angegeben:LINQ Dynamic Expression API, Prädikat mit DBNull.Value Vergleich

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"); 

ich am Ende die Störung zu erhalten: „Keine Eigenschaft oder ein Feld‚DBNull‘existiert in Typ‚<> f__AnonymousType0`2‘“

Jedermann haben Ideen, wie man um das herum? Ich kann Submission.Field ("NullableIntColumnName") nicht in der Zeichenfolge verwenden, die entweder an die Where-Methode übergeben wird, oder andernfalls wäre ich in der Lage, mit null anstelle von DBNull.Value zu vergleichen.

Antwort

3

Nun, ich habe es endlich verstanden. cptScarlet hatte es fast.

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

oder

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

Diese Lösung funktioniert nicht für mich, weil ich benutzerdefinierte Select-Teil verwende. Wenn Sie ein benutzerdefiniertes Objekt wie ein DTO in Teil auswählen verwenden, ist auch der Typ der Spalte nullfähig. – ahmet

1

Was passiert, wenn Sie Ihre aktuelle .Where mit etwas ersetzen wie

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

Extrem unwahrscheinlich arbeiten - {0} mit null ersetzt wird, wie das ist, waht DBNull.Value.ToString() liefert –

+0

Klarstellung: Dynamische Linq verfügt über eine eigene Parser, der den String interpretieren wird passwed zu Where, indem er es als Zeichenfolgenausdruck analysiert –

+0

Danke cptScarlet ... sobald ich deine Antwort sah, erinnerte ich mich an die Where-Überladung, die ein string- und params-Objekt [] zusammennimmt. –

0

Sorry an Nicht-Antwort mit einem USL aber ...

Haben Sie in der Quelle angesehen? Es gibt nicht viel davon. Meine Vermutung ist, dass DBNull nicht in der Liste der registrierten Root-Objekte ist.

Ich habe gerade nicht die Quelle zur Hand, aber es ist wahrscheinlich auch, Ihnen zu sagen, was andere Konstanten vielleicht verglichen werden könnte.

0

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

Edit:

Sorry, did't ich diese dynamische Anforderung sehen ... Dynamische wäre: (zumindest im Rahmen 4)

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

Nein, das hätte ich nicht tun können, die Spaltenauswahl ist dynamisch, basierend auf Benutzereingaben. –

1

Wenn Sie Sie x.Field<int>("Table1_ID") zu x.Field<int?>("Table1_ID") dann‘ändern ll nullable ganze Zahlen anstelle von regulären ganzen Zahlen, und alle DBNull Werte werden in einfache C# Nullwerte umgewandelt. Basierend auf Ihrem Code-Snippet, bin ich mir nicht einmal sicher, ob Sie dynamische Ausdrücke benötigen - ein einfacher .Where(foo => foo.x == null) sollte funktionieren.

+0

Ich brauchte definitiv dynamische Ausdrücke, aber Punkt über Int verwendet? für den Typparameter. –

1

In der Regel können Sie auch versuchen:

.Where("NullableColumnName.HasValue");