LINQ學習中關於null相關的問題及解決方案

2021-09-06 05:50:16 字數 3271 閱讀 8276

來自: 加以更新

null詞語釋義:程式設計中的null表示不可用的資料,沒有意義.

1. 無效的;無價值的

2. 【數】零的

null在資料庫中表示 不知道(unknown) 的資料,主要有3種意思:

1)知道資料存在,但不知道具體值

2)不知道資料是否存在

3)資料不存在

null在資料庫中的說明可以參考這篇文章:sql開發中容易忽視的一些小地方(一)

"null"這個物件在不同的程式設計環境下有不同的含義,這裡就不多說了,現在想總結下我在學習linq時關於處理null的問題.  

第一:陣列元素中的null .有如下乙個二維整形陣列

int numbers =,

newint

,new

int };

我們用拉姆達表示式想得到這個二維陣列裡面的每乙個元素構成的列表,我們可以這樣寫:

ienumerable

<

int>

list 

=numbers.selectmany(c 

=>

c);

selectmany專門是針對一對多的處理而設計的.一般情況下都應該會正常執行,如果再給numbers增加乙個值為null的元素呢?程式還會正常嗎?答案是否定的,它會丟擲:object reference not set to an instance of an object.

int numbers =,

newint

,new

int ,                

null};

解決方案:利用"??"運算子判斷c是否等於null,如果等於則利用enumerable.empty返回乙個具有指定的型別引數的空,這樣在取元素時會跳過元素為空的值。

ienumerable

<

int>

list 

=numbers.selectmany(c 

=>

c ??

enumerable.empty

<

int>

());

文中例子說明:

表名:  table_2

列:iscore

型別:int.

是否可空:是

第二:linq to sql中的sum.計算成績大於50的所有成績總分:執行下面語句時會報異常.

inti 

=db.table_2s.where

<

table_2

>

(t=>

t.iscore

>

50).sum

<

table_2

>

(t =>

t.iscore);

分析原因:我們把資料庫物件table_2 放進dbml檔案時,列iscore會生成如下**,看下system.nullableiscore.,iscore由於要進行sum運算,而vs預設認為sum裡面的字段都不為空,所以會出錯,為點與sql有區別,sql在進行彙總時,會忽略null的值。

[column(storage="

_iscore

", dbtype="

int"

)]public

system.nullable

<

int>

iscore

解決方案:

1:在視覺化生成**後,手動把nullable去掉.              

[column(storage="

_iscore

", dbtype="

int"

)]public

intiscore

2:或者在資料庫中修改表結構,要求彙總的字段都為非空.

第三:linq to sql中,如何來判斷一條記錄的某個字段值是否等於null?計算id等於null且成績大於50的成績總分,我們可以這樣寫:和sql的唯一區別是,linq to sql中:t.id ==null,等號為兩個等號,而在sql中是乙個.

inti 

=db.table_2s.where

<

table_2

>

(t=>

t.id 

==null

&&t.iscore

>

50).sum

<

table_2

>

(t =>

t.iscore);

第四:linq 中,我們取乙個集合的第乙個元素,例如:

int numbers4  =;

intb 

=numbers4.first (n 

=>

n >

10);

上面是查詢陣列中第乙個大於10的元素,但上面的語句在執行會報:sequence contains no elements的提示以及相應的異常.如何避免呢,總不能先count再判斷吧,我們可以利用firstordefault來解決這種問題.如果不存在,會返回乙個預設的值,這個值相當於初始化int i;

inta 

=numbers4.firstordefault(n 

=>

n >

10);

但是:如果在實際運用中:當天某乙個產品賣出的數量(萬一這個產品根本就沒有賣出去,也就查詢不出來了 就報錯,所以還是count在判斷吧)

eg:

try

;//異常處理當記錄為空的時候

if (quary.count() == 0)

var sum = quary.sum(d => d.quantity);

return sum;

}catch (exception ex)

總結:1:遍歷集合時,最好使用c => c ?? enumerable.empty()條件,避免元素為空導致出錯;

2:在對表字段進行彙總求和時,字段要求為非空;

3:查詢表記錄時,判斷乙個字段是否等於null,用法和sql差不多,含義一樣;

4:計算集合第乙個元素時,盡量使用firstordefault,避免結果集為空導致程式出錯.

上面是關於null在linq中和其它語言不太一樣的地方,大家如果還有其它的觀點可以指教下.

LINQ系列 C 中與LINQ相關特性

1.匿名型別 通過關鍵字var定義匿名型別,編譯器將根據運算子右側表示式的值來發出乙個強型別。使用匿名型別時要遵守的一些基本規則 匿名型別必須有乙個初始化值,而且這個值不能是空值 null 因為型別是根據初始化器推斷出來的 匿名型別可以用於簡單型別,也可以用於複雜型別。用於定義簡單型別時,其價值不大...

LinQ中為null的判斷解決方案

先看部門表設計和資料 注意 pid為父部門的id號,如果是頂級部門則沒有pid pid為null 如果要查詢為null的pid,我們知道sql語句應該是 select from depart where pid is null 很多人用linq寫成 code int?pid null listdep...

Oracle中NULL值相關問題

null值不等於0,也不等於空,它表示該值不定。任何運算 加減乘除 字串連線等 的運算數中包括null值時,整個表示式的值即為null。使用單行函式對null值進行處理,得到的結果也為null nvl等函式除外 但是null值的布林運算結果並不一定是null,例外的情況為,false and nul...