Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq空值不可比较_C#_Sql Server_Asp.net Mvc_Linq_Entity Framework - Fatal编程技术网

C# Linq空值不可比较

C# Linq空值不可比较,c#,sql-server,asp.net-mvc,linq,entity-framework,C#,Sql Server,Asp.net Mvc,Linq,Entity Framework,场景是,我需要检查行的每一列,看看它是否包含用户ID。我只希望能够在其他任何列中都不存在的情况下,将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是自动的 因此,表的当前状态为: 1

场景是,我需要检查行的每一列,看看它是否包含用户ID。我只希望能够在其他任何列中都不存在的情况下,将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是自动的

因此,表的当前状态为:

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行(第2列有userID)上运行它时,我也没有得到任何结果

如果这是SQL直截了当的,我可能会在userID上放一个isnull(userID“”)包装器,但据我所知,这在Linq中是不可能的

我无法检查NULL(即t.No2!=userID&&t.No2==NULL),因为这意味着我将能够将一个userID插入到另一列中已经有该userID的行中


将数据库设计为在每列中都有默认值“”以使Linq能够比较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();

好的,如果我为“”的每一列指定一个默认值,那么我的原始逻辑就会工作


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

我相信对每一列进行显式的空检查可能会有所帮助?

我不确定我是否完全理解,但您的检查不应该是
(t.No2!=userID | | t.No2==null)
我完全不明白该模型应该代表什么。。如果从列到行进行规范化会更好吗?这是一个相当不错的场景:)正如所解释的。。。如果我包含t.No2==Null,它将允许我在该列中输入用户ID,即使该用户ID存在于行中的另一列中,您使用的是什么版本的EF?Linq to entities不会接受此查询,因为它不知道如何将
Compare()
转换为SQL。