【问题标题】:Linq null value not comparingLinq空值不比较
【发布时间】:2013-01-18 07:20:14
【问题描述】:

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

表格如下:

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 列有用户 ID)上运行它时,我什么也得不到。

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

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

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

【问题讨论】:

  • 不确定我是否完全理解,但你的支票不应该是(t.No2 != userID || t.No2 == NULL)
  • 我完全不知道该模型应该代表什么......如果从列标准化到行会更好吗?
  • 这是一个相当不错的场景:)
  • 如解释...如果我包含 t.No2 == Null,即使用户ID 存在于行内的另一列中,它也允许我将用户ID 输入该列
  • 你用的是什么版本的EF?

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


【解决方案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();

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以写比较函数像

      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 to entity 不会接受这个查询,因为它不知道如何将Compare() 翻译成 SQL。
      【解决方案4】:

      好的,如果我为 '' 的每一列分配一个默认值,我的原始逻辑就可以工作。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        • 2017-02-13
        • 1970-01-01
        相关资源
        最近更新 更多