2011-04-07 30 views
4

我想要一個優雅的方式來使用LINQ將多個列連接在一起,但當任何列爲NULL時使用+操作符或concat()會導致NULL連接後的值。如何在正確處理NULL值的情況下在LINQ中連接字符串

是否有類似於concat()來處理NULL的不同,或者我以不正確的方式思考這個問題?

任何幫助表示讚賞!

這裏是我使用的代碼:

List<CustomObject> objects = (
    from obj in ObjectTable 
    where obj.Id == Id 
    select new CustomObject() 
    { 
     EnteredBy = obj.EnteredBy, 
     EntryDate = obj.EntryDate, 
     WorknoteText = 
      obj.VchWorkNote1 + 
      obj.VchWorkNote2 + 
      obj.VchWorkNote3 + 
      obj.VchWorkNote4 + 
      obj.VchWorkNote5 + 
      obj.VchWorkNote6 + 
      obj.VchWorkNote7 + 
      obj.VchWorkNote8 + 
      obj.VchWorkNote9 + 
      obj.VchWorkNote10 + 
      obj.VchWorkNote11 + 
      obj.VchWorkNote12 + 
      obj.VchWorkNote13 + 
      obj.VchWorkNote14 + 
      obj.VchWorkNote15 + 
      obj.VchWorkNote16 + 
      obj.VchWorkNote17 + 
      obj.VchWorkNote18 + 
      obj.VchWorkNote19 + 
      obj.VchWorkNote20 
    }).ToList(); 
+0

哇,這是瘋了。您應該完全添加一個計算列,如@taylorn建議的。 – 2011-04-07 20:07:26

+0

'(string)null + null' - >'「」'',我在這裏錯過了什麼? – 2011-04-07 20:28:15

回答

12

一種選擇是使用空合併運算符:

List<CustomObject> objects = (from o in ObjectTable 
           where o.Id == Id 
           select new CustomObject(){ 
           EnteredBy = o.EnteredBy, 
           EntryDate = o.EntryDate, 
           WorknoteText = 
           (o.VchWorkNote1 ?? "") + 
           (o.VchWorkNote2 ?? "") + 
           (o.VchWorkNote3 ?? "") + 
           (o.VchWorkNote4 ?? "") + 
           ... 
           (o.VchWorkNote20 ?? "") 
           }).ToList(); 

希望生成的SQL會使用適當的翻譯。

+0

完美。我不知道我是怎麼忘了這個... – CircusNinja 2011-04-07 20:21:33

3

可以使用?? operator這樣:

... 
(object.VchWorkNote5 ?? "") + 
(object.VchWorkNote6 ?? "") + 
(object.VchWorkNote7 ?? "") + 
... 
0

有可能是一個更清潔的方式,但首先想到的會是一個快速的零到零長度字符串轉換:

List<CustomObject> objects = (from object in ObjectTable 
         where object.Id == Id 
        select new CustomObject(){ 
         EnteredBy = object.EnteredBy, 
         EntryDate = object.EntryDate, 
         WorknoteText = 
         object.VchWorkNote1 ?? "" + 
         object.VchWorkNote2 ?? "" + 
         object.VchWorkNote3 ?? "" + 
         object.VchWorkNote4 ?? "" + 
         object.VchWorkNote5 ?? "" + 
         object.VchWorkNote6 ?? "" + 
         object.VchWorkNote7 ?? "" + 
         object.VchWorkNote8 ?? "" + 
         object.VchWorkNote9 ?? "" + 
         object.VchWorkNote10 ?? "" + 
         object.VchWorkNote11 ?? "" + 
         object.VchWorkNote12 ?? "" + 
         object.VchWorkNote13 ?? "" + 
         object.VchWorkNote14 ?? "" + 
         object.VchWorkNote15 ?? "" + 
         object.VchWorkNote16 ?? "" + 
         object.VchWorkNote17 ?? "" + 
         object.VchWorkNote18 ?? "" + 
         object.VchWorkNote19 ?? "" + 
         object.VchWorkNote20 ?? "" 
        }).ToList(); 
+0

這是不正確的。加運算符的優先級高於運營商。你應該添加括號(object.VchWorkNote1 ??「」) – arni 2018-02-19 11:40:04

2

你可以添加一個新的列到你的數據庫?像「關鍵字」或「全文」

定義它有一個計算的東西,這是計算基本上"ISNULL(<Field1>, '') + ISNULL(<Field2>, '')"

確保將其標記爲繼續存在,因此它不會每次都來計算。

然後你只需要從你的表中拉出一個字段。

相關問題