表达式的结果始终为真

4

我在linq中进行了左连接,UserId的值是可空的(不在表中),但在连接中。Visual Studio显示此警告。

我认为这是一个误报,因为当userid为null时,代码能够正常工作,IsSelected为false。

UserPrivilege类

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Collections.Generic;

public partial class UserPrivileges
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public int PrivilegeId { get; set; }

    public virtual Privileges Privileges { get; set; }
    public virtual UserProfile UserProfile { get; set; }
}

这个Linq查询:

using (var dataContext = new MyEntities())
{
List<UserPrivilegesModel> result = (from privileges in dataContext.Privileges
                                    join userPrivileges in dataContext.UserPrivileges on privileges.Id equals userPrivileges.PrivilegeId into tmpUserPrivileges
                                    from userPrivileges in tmpUserPrivileges.DefaultIfEmpty()
                                        //where userPrivileges.UserId == userId
                                    select new UserPrivilegesModel { IsSelected = (userPrivileges.UserId != null), Description = privileges.Description, PrivilegeId = privileges.Id }).ToList();
return result;
}

这里输入图片描述

在 Linq 中,userid == null 为 TRUE 这里输入图片描述

SQL 脚本:

GO
/****** Object:  Table [dbo].[Privileges]    Script Date: 07/12/2016 10:35:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Privileges](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](20) NOT NULL,
    [Description] [nvarchar](100) NOT NULL,
 CONSTRAINT [PK_Privileges] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[UserPrivileges]    Script Date: 07/12/2016 10:35:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[UserPrivileges](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [UserId] [int] NOT NULL,
    [PrivilegeId] [int] NOT NULL,
 CONSTRAINT [PK_UserPrivileges_1] PRIMARY KEY CLUSTERED 
(
    [UserId] ASC,
    [PrivilegeId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[UserProfile]    Script Date: 07/12/2016 10:35:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[UserProfile](
    [UserId] [int] IDENTITY(1,1) NOT NULL,
    [UserName] [nvarchar](56) NOT NULL,
    [Enabled] [smallint] NULL,
 CONSTRAINT [PK__UserProf__1788CC4CB96C92F3] PRIMARY KEY CLUSTERED 
(
    [UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [UQ__UserProf__C9F28456208EB813] UNIQUE NONCLUSTERED 
(
    [UserName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[UserPrivileges]  WITH CHECK ADD  CONSTRAINT [FK_UserPrivileges_Privileges] FOREIGN KEY([PrivilegeId])
REFERENCES [dbo].[Privileges] ([Id])
GO
ALTER TABLE [dbo].[UserPrivileges] CHECK CONSTRAINT [FK_UserPrivileges_Privileges]
GO
ALTER TABLE [dbo].[UserPrivileges]  WITH CHECK ADD  CONSTRAINT [FK_UserPrivileges_UserProfile] FOREIGN KEY([UserId])
REFERENCES [dbo].[UserProfile] ([UserId])
GO
ALTER TABLE [dbo].[UserPrivileges] CHECK CONSTRAINT [FK_UserPrivileges_UserProfile]
GO

SQL关系

enter image description here


1
你应该将属性设置为可空。 - SLaks
1
将来请确保在问题中包含相关的代码,以文本形式呈现。图片不太适合移动设备,并且它也不允许用户将您的代码复制粘贴到答案中。任何想要提供基于代码的答案的人都必须重新输入您的代码。 - Tyler Roper
我已经包含了代码。 - Evilripper
1
你应该检查 userPrivlages == null 而不是 userPrivlages.UserId == null 吗?另外,第二个 from 和 join 是否应该使用相同的名称? - Scott Chamberlain
感谢@Scott Chamberlain,这是正确的答案! - Evilripper
显示剩余2条评论
3个回答

4
你是否应该检查userPrivlages == null而不是userPrivlages.UserId == null?另外,第二个from和join是否应该使用相同的名称?
尝试纠正这些问题。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Evilripper

2

数据库中的类型可能为空,但代码中的类型不是。 UserIdint 类型,永远不会是 null。(因此出现了错误。)所以,在某个类上,您可能有类似以下的内容:

public int UserId { get; set; }

为使类型可为空,您需要这样做:
public int? UserId { get; set; }

或者,如果您更喜欢这个:
public Nullable<int> UserId { get; set; }

这可能对其他没有显示的关于如何使用该属性的代码产生影响,因为您正在更改属性的类型。但这将允许该属性携带空值。

用户ID在数据库的<自动生成>类中!:( - Evilripper
1
@Evilripper:那么要么该值不能为空,要么您正在使用一个有问题的代码生成工具。 - David

0

userPrivaleges.UserId 不可为空,因此 (userPrivalegs.UserId != null) 总是为真。


我尝试使用userid == null,然后它返回TRUE! - Evilripper
我认为问题出在你尝试执行查询的方式上。我看不到你的数据模型,但是用户和用户权限集合之间是否存在关系呢? - Derek
是的,我看到了,现在我只是好奇。 - Derek
1
我加了SQL脚本和关系模式,玩的愉快!:D - Evilripper
1
你说得对,但我总是为所有表格都放置一个id(我知道这是错误的,但它可以返回非常有用的信息)。 我正在使用entity framework database first和mvc 5。我必须开发一个带有复选框权限的UI -> isSelected用于复选框,如果没有该行,则用户没有该权限。我认为这种方式更有效率,但是我应该从配置文件对象中导航(但我需要所有权限来显示所有可选的权限)。 - Evilripper
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接