2016-12-06 7 views
2

私はlinqで左結合を行い、UserIdの値はNULLABLE(表内ではありません)ですが、結合とビジュアルスタジオでこの警告が表示されます。式の結果は常にtrue

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クエリ:LINQのユーザーIDで

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

== nullがTRUEである enter image description here

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

プロパティをnullにする必要があります。 – SLaks

+1

今後、*のテキストに関連するコードを必ず*含めてください。画像はモバイルフレンドリーではなく、ユーザーがコードをコピーして回答に貼り付けることもできません。コードベースの回答をあなたに提供したいと思っている人は、あなたのコードを再入力する必要があります。 – Santi

+0

クラスが自動生成できません。 – Evilripper

答えて

3

userPrivlages == nullを確認する必要がありますか?userPrivlages.UserId == nullではありませんか?また、fromとjoinが同じ名前を使用する必要がありますか?

これらの問題を修正してください。

+0

名前を変更しますが、同じ名前でも動作します!すべてのオブジェクト(行)はnullです。警告は消えてしまいました。もう一度感謝します。 – Evilripper

0

userPrivaleges.UserIdは、したがって、(userPrivalegs.UserId!= nullが)常にtrueになります、NULL可能ではありません。

+0

はい、この場合(LEFT JOIN)はnullです! – Evilripper

+0

あなたはentityframeworkを使用していますか? – Derek

+0

はい私はentityframeworkを使用します。 – Evilripper

3

データベースのタイプがである可能性がありますが、コードのタイプはnullである可能性があります。 UserIdのタイプはintであり、決してnullであることはできません。 (。そこでエラー)だから、おそらくクラス上のどこかに、あなたがこのようなものがあります:あなたが好む場合

public int? UserId { get; set; } 

それとも、この:あなたはこれを望む、タイプがNULL可能にするために

public int UserId { get; set; } 

を:

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

これは、プロパティのタイプを変更していることから、そのプロパティを使用する方法についてここでは示していない他のコードでの意味合いを持つことができます。しかしこれにより、そのプロパティはnull値を持つことができます。

+0

UserIdはデータベースからクラスにあります! : – Evilripper

+1

@Evilripper:値をnullにできないか、壊れたコード生成ツールを使用しています – David