Frage

In SQL können Sie eine ISNULL laufen (null, ''), wie würden Sie dies tun in einer Linq-Abfrage?

Ich habe ein in dieser Join-Abfrage:

var hht = from x in db.HandheldAssets
        join a in db.HandheldDevInfos on x.AssetID equals a.DevName into DevInfo
        from aa in DevInfo.DefaultIfEmpty()
        select new
        {
        AssetID = x.AssetID,
        Status = xx.Online
        };

aber ich habe eine Spalte, die einen Bit-Typen hat, die nicht NULL sein kann (xx.online), wie ich dies auf false gesetzt, wenn es null ist?

War es hilfreich?

Lösung

Da aa ist das Set / Objekt, das null sein könnte, können Sie aa == null überprüfen?

(aa / xx könnte austauschbar sein (ein Tippfehler in der Frage), die ursprüngliche Frage spricht über xx aber nur definiert aa)

d.

select new {
    AssetID = x.AssetID,
    Status = aa == null ? (bool?)null : aa.Online; // a Nullable<bool>
}

oder wenn Sie der Standard wollen false (nicht null) werden:

select new {
    AssetID = x.AssetID,
    Status = aa == null ? false : aa.Online;
}

Update; als Reaktion auf die downvote, habe ich untersucht mehr ... Tatsache ist, dann ist dies der richtige Ansatz! Hier ist ein Beispiel auf Nordwind:

        using(var ctx = new DataClasses1DataContext())
        {
            ctx.Log = Console.Out;
            var qry = from boss in ctx.Employees
                      join grunt in ctx.Employees
                          on boss.EmployeeID equals grunt.ReportsTo into tree
                      from tmp in tree.DefaultIfEmpty()
                      select new
                             {
                                 ID = boss.EmployeeID,
                                 Name = tmp == null ? "" : tmp.FirstName
                        };
            foreach(var row in qry)
            {
                Console.WriteLine("{0}: {1}", row.ID, row.Name);
            }
        }

Und hier ist die TSQL - ziemlich viel, was wir wollen (es ist nicht ISNULL, aber es ist nahe genug):

SELECT [t0].[EmployeeID] AS [ID],
    (CASE
        WHEN [t2].[test] IS NULL THEN CONVERT(NVarChar(10),@p0)
        ELSE [t2].[FirstName]
     END) AS [Name]
FROM [dbo].[Employees] AS [t0]
LEFT OUTER JOIN (
    SELECT 1 AS [test], [t1].[FirstName], [t1].[ReportsTo]
    FROM [dbo].[Employees] AS [t1]
    ) AS [t2] ON ([t0].[EmployeeID]) = [t2].[ReportsTo]
-- @p0: Input NVarChar (Size = 0; Prec = 0; Scale = 0) []
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

QED?

Andere Tipps

Sie können die ?? Operator verwenden den Standardwert zu setzen, sondern müssen Sie zuerst die Nullable Eigenschaft auf true in der dbml Datei in das gewünschte Feld (xx.Online)

var hht = from x in db.HandheldAssets
        join a in db.HandheldDevInfos on x.AssetID equals a.DevName into DevInfo
        from aa in DevInfo.DefaultIfEmpty()
        select new
        {
        AssetID = x.AssetID,
        Status = xx.Online ?? false
        };

Ich habe oft dieses Problem mit Sequenzen (im Gegensatz zu diskreten Werten entgegengesetzt). Wenn ich eine Folge von Ints habe, und ich mag, dass sie zu der Summe, wenn die Liste leer ist werde ich die Fehlermeldung „InvalidOperationException angezeigt: Der Nullwert kann nicht mit Typ System.Int32 ein Mitglied zugewiesen werden, die ein Nicht-Nullable-Wert ist geben. ".

Ich finde, ich kann dieses Problem lösen, indem die Sequenz zu einem Nullable Type Gießen. SUM und die anderen Aggregat Betreiber haben diesen Fehler nicht auslösen, wenn eine Folge von Nullable Types ist leer.

So zum Beispiel so etwas wie diese

MySum = MyTable.Where(x => x.SomeCondtion).Sum(x => x.AnIntegerValue);

wird

MySum = MyTable.Where(x => x.SomeCondtion).Sum(x => (int?) x.AnIntegerValue);

Die zweite 0 zurück, wenn keine Zeilen die where-Klausel entsprechen. (Die erste wirft eine Ausnahme, wenn keine Zeilen übereinstimmen).

Sieht aus wie der Typ boolean ist und daher nie Null sein kann und sollte standardmäßig falsch sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top