Linq空值不比较

本文关键字:比较 空值 Linq | 更新日期: 2023-09-27 17:54:20

场景是,我需要检查一行的每一列,看看它是否包含userID。我只希望能够插入一个userID到一个列,如果它不存在于任何其他列。

表:

Col1 = ID (PK)
Col2 = No1 varchar(50) ..... also tried GUID
Col3 = No2 varchar(50) ..... also tried GUID
Col4 = No3 varchar(50) ..... also tried GUID

除ID为auto外,每列的默认值为空。

表的当前状态为:

1  NULL  NULL  NULL
2  NULL  NULL  NULL
3  NULL  2     NULL

我要做的是将userID值插入所选列,前提是userID不存在于任何其他列中。

我试了如下:

mymodel m = new mymodel()
m = db.mytable.Where(t => 
t.id == id && 
t.No1 != userID &&
t.No2 != userID &&
t.No3 != userID).First();

思路是先检查条目,然后运行更新。

现在当我运行这个并且所有列都为空时,我什么也得不到。当我在第3行(userID在col2中)上运行它时,我也没有得到任何结果。

如果这是直接的SQL,我可能会在userID上放一个isnull(userID, ")包装器,但据我所知,这在Linq中是不可能的。

我不能检查NULL(即t.No2 != userID &&t.No2 == NULL),因为这意味着我将能够将userID插入到已经在另一列中说过userID的行中。

我唯一的选择是设计数据库在每个列中都有默认值"以使Linq能够比较NULL吗?

Linq空值不比较

我可能误解了,但通常可以这样做:

mymodel m = new mymodel()
m = db.mytable.Where(t => 
t.id == id && 
(t.No1 == null || t.No1 != userID) &&
(t.No2 == null || t.No2 != userID) &&
(t.No3 == null || t.No3 != userID)).First();

我相信在每个列上做一个显式的null检查可能会有帮助?

先检查UserID是否有值:

mymodel m = new mymodel()
m = db.mytable.Where(t => 
t.id == id && (!userId.HasValue ||
(t.No1 != userID.Value &&
t.No2 != userID.Value &&
t.No3 != userID.Value))).First();

你可以这样写比较函数

public bool Compare(ColmunNo1DataType colValue, UserIdDataType userId){...}

并使用下一个LINQ代码

mymodel m = new mymodel()
m = db.mytable.Where(t => 
t.id == id && 
Compare(t.No1,userID) &&
Compare(t.No2,userID) &&
Compare(t.No3,userID)).First();

如果我为" .

的每一列分配一个默认值,那么我的原始逻辑就可以工作了。

NULL在Linq…但是空字符串是。