Linq null值不比较

时间:2013-01-18 07:20:14

标签: c# sql-server asp.net-mvc linq entity-framework

场景是我需要检查一行的每一列,看它是否包含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

每列的默认值为空bar,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();

我们的想法是首先检查条目,然后再运行更新。

现在,当我运行此列并且所有列都为null时,我什么也得不回来。 当我在第3行(在第2列中有userID)上运行它时,我也什么都没得到。

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

我无法检查NULL(ietNo2!= userID&& t.No2 == NULL),因为这意味着我将能够将userID插入已经在另一列中已经具有所述userID的行中。

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

4 个答案:

答案 0 :(得分:1)

我可能会误解,但通常可以做一些事情:

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();

我认为对每列进行显式空检查可能会有帮助吗?

答案 1 :(得分:0)

首先检查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();

答案 2 :(得分:0)

您可以编写比较函数,如

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();

答案 3 :(得分:0)

好的,如果我为''。

的每一列分配一个默认值,我的原始逻辑就有效

在Linq中不比较NULL ...但是空字符串是。