场景是,我需要检查一行的每一列,看看它是否包含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吗?
我可能误解了,但通常可以这样做:
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…但是空字符串是。