c# - Linq to SQL 可空整数?

标签 c# sql-server linq

我有以下 linq 查询(非常简单):

var jobs = from j in db.jobmsts
    join jd in db.jobdtls on j.jobdtl_id equals jd.jobdtl_id
    where j.jobmst_type != 1 && j.jobmst_prntid.Equals(folder.FolderID)
    orderby j.jobmst_name
    select new
        {
            JobID = j.jobmst_id,
            JobName = j.jobmst_name,
            Description = j.jobmst_desc,
            Source = jd.Source
        };

folder.FolderID 是一个可以为 null 的整数(int?),它作为参数传递到方法中。因此,当它为 null 时,查询不返回任何结果。但是如果我在 TSQL 中执行相同的查询:

select * from jobmst j 
join jobdtl jd on j.jobdtl_id = jd.jobdtl_id 
where j.jobmst_type != 1 and j.jobmst_prntid is null

我得到 6 条记录。奇怪的是,如果我将“folder.FolderID”替换为“null”(在 linq 代码中),它会返回 6 条记录。因此,显然“null”和具有空值的对象之间存在差异。我只是不知道它是什么以及如何解决这个问题。

仅供引用,我的代码使得 where 子句如下所示:

where j.jobmst_type != 1 && j.jobmst_prntid == folder.FolderID

但也没有产生任何结果。

如有任何帮助,我们将不胜感激。

最佳答案

正如我在评论中提到的那样:Compare nullable types in Linq to Sql

该问题的答案也适用于此:查询可空类型时,Linq to SQL 的行为有点奇怪。解决方案是在可空类型的值为 null 时显式检查 null。如果您不想编写两个查询,只需编写不同的 where 子句(您必须混合一些 lambda 语法):

Expression<Func<Job,bool>> predicate;
if(folder.FolderID == null) {
    predicate = j=>j.jobmst_prntid == null && j.jobmst_type != 1;
} else {
    predicate = j=>j.jobmst_prntid == folder.FolderID && j.jobmst_type != 1;
}

//...
.Where(predicate)
select new
{
    // ...
}

关于c# - Linq to SQL 可空整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28730885/

相关文章:

c# - 扩展 Entity Framework 模型

sql - 必须在 sql 中声明标量变量....带有输入和输出参数

c# - 从选择中排除 DataGridView 的最后一列

c# - 有没有办法在 C# 的 LINQ Where 方法中捕获索引值?

c# - 使用 ADO.Net 多线程访问 MySQL

c# - 在c#中创建一个改变按钮效果的方法

sql - 在 sql server 中使用全文搜索查找单词部分

c# - ASP MVC : ViewModel index using master detail linq statement

c# - 为什么我不能在没有初始值设定项的情况下声明隐式类型数组?

sql - 从 SQL Server 获取 JSON 格式的分层数据