表达式的结果始终为真

时间:2016-12-06 17:33:10

标签: c# .net visual-studio linq

我在linq中进行了左连接,UserId的值为NULLABLE(不在表中),但是在join和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;
}

enter image description here

On Linq userid == null为TRUE enter image description here

SQL SCRIPT:

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

3 个答案:

答案 0 :(得分:3)

数据库中的类型可以为空,但代码中的类型不可以。 UserId的类型为int,永远不会是null。 (因此错误。)所以大概在一个类的某个地方,你有这样的东西:

public int UserId { get; set; }

要使类型为可空,您需要这样:

public int? UserId { get; set; }

或者,如果您愿意,请:

public Nullable<int> UserId { get; set; }

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

答案 1 :(得分:3)

您是否应该检查userPrivlages == null而不是userPrivlages.UserId == null?另外,第二个和连接应该使用相同的名称吗?

尝试纠正这些问题。

答案 2 :(得分:0)

userPrivaleges.UserId不可为空,因此(userPrivalegs.UserId!= null)将始终为真。