【问题标题】:The result of the expression is always true表达式的结果始终为真
【发布时间】:2016-12-06 17:33:10
【问题描述】:

我在 linq 中进行了左连接,并且 UserId 的值为 NULLABLE(不在表中)但在连接中,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 用户 ID == 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 关系

【问题讨论】:

  • 你应该让你的属性可以为空。
  • 以后,请确保在问题中包含相关代码作为文本。图片不适合移动设备,也不允许用户将您的代码复制+粘贴到答案中。任何想为您提供基于代码的答案的人都必须重新输入您的代码。
  • 我不能自动生成课程。
  • 我包含了代码。
  • 你应该检查userPrivlages == null而不是userPrivlages.UserId == null吗?另外,第二个 from 和 join 是否应该使用相同的名称?

标签: c# .net visual-studio linq


【解决方案1】:

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

尝试纠正这些问题。

【讨论】:

  • 我会更改名称,但它也可以使用相同的名称!所有对象(行)为空,现在警告消失了。再次感谢。
【解决方案2】:

database 中的类型可以为空,但code 中的类型不能。 UserIdint 类型,它永远不能是 null。 (因此出现错误。)所以大概在某个地方的某个类上你有这样的东西:

public int UserId { get; set; }

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

public int? UserId { get; set; }

或者,如果您愿意,可以这样:

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

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

【讨论】:

  • UserId 在数据库中的 类中! :(
  • @Evilripper:那么要么该值不能为空,要么您使用的是损坏的代码生成工具。
【解决方案3】:

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

【讨论】:

  • 我尝试使用 userid == null 并且它返回 TRUE!
  • 我认为问题在于您尝试执行查询的方式。我看不到您的数据模型,但用户和用户权限集合之间是否存在关系?
  • 请查看接受的答案,我犯了一个错误,因为我检查了字段而不是所有对象(在 sql 标准中,左连接在 linq 返回对象中返回空字段)。如果我检查对象为空,警告就会消失。
  • 我添加了脚本 sql 和 rel 架构玩得开心! :D
  • 你是对的,但我总是为所有表设置一个 id(我知道这是错误的,但它可以返回非常有用)。我首先使用实体​​框架数据库和 mvc 5。我必须开发一个具有复选框权限的 UI -> isSelected 用于复选框,如果没有行用户没有权限。我认为这种方式效率更高,但是是的,我应该从配置文件对象导航(但我需要所有权限才能显示所有可检查的权限)。
猜你喜欢
  • 1970-01-01
  • 2015-12-14
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多