我有一个简单的 SQL 表,它定义了一组分层类别和子类别 - 请注意,“顶级”类别的 ParentCategoryId 可以为空...
CREATE TABLE [dbo].[Category](
[CategoryId] [uniqueidentifier] NOT NULL,
[ParentCategoryId] [uniqueidentifier] NULL,
[Name] [nvarchar](50) NOT NULL
)
如果我然后构造一个 Linq 表达式以通过名称和 ParentCategoryId 查找特定类别,我发现如果我设置一个 Guid 就无法得到正确的结果?变量为空:
Guid? parentCategoryId = null;
var category = dc.Categories
.Where(c => (
(c.Name == "Fred") &&
(c.ParentCategoryId == parentCategoryId)
));
这不会产生与以下相同的结果:
var category = dc.Categories
.Where(c => (
(c.Name == "Fred") &&
(c.ParentCategoryId == null)
));
根据我在网上可以找到的信息,其他人也遇到过这个问题,但我一直没能找到一个干净的解决方法来解决这个问题。
任何想法将不胜感激。谢谢。
附加信息 这是 LINQ 为第一个 Guid 生成的 SQL 语句?空参数,然后是一个简单的空参数:
-- With Guid? null parameter : return an empty record set
DECLARE @p0 NVarChar(1000) SET @p0 = 'Fred'
DECLARE @p1 UniqueIdentifier SET @p1 = null
SELECT [t0].[CategoryId], [t0].[ParentCategoryId], [t0].[Name], [t0].[Timestamp]
FROM [dbo].[cad_ScoCategory] AS [t0]
WHERE ([t0].[Name] = @p0) AND ([t0].[ParentCategoryId] = @p1)
-- With null parameter - returns a single (correct) record
DECLARE @p0 NVarChar(1000) SET @p0 = 'Fred'
SELECT [t0].[CategoryId], [t0].[ParentCategoryId], [t0].[Name], [t0].[Timestamp]
FROM [dbo].[cad_ScoCategory] AS [t0]
WHERE ([t0].[Name] = @p0) AND ([t0].[ParentCategoryId] IS NULL)
如您所见,第一个选项将 ParentCategoryId 与一个空参数进行比较,而第二个方法检查 ParentCategoryId IS NULL - 这是正确的
最佳答案
不,不幸的是,这是一个相当普遍的问题。解决方法是显式地与 null 进行比较:
.Where(c => c.Name == Fred &&
((c.ParentCategoryId == parentCategoryId) ||
(c.ParentCategoryId == null && parentCategoryId == null)))
或者,在查询之外执行检查(以更改使用的过滤器):
var category = dc.Categories.Where(c => c.Name == "Fred");
category = parentCategoryId == null
? category.Where(c => c.ParentCategoryId == null)
: category.Where(c => c.ParentCategoryId == categoryId);
关于c# - Linq to Sql 中的可空 Guid 产生意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9942550/