Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq到SQL可空int?_C#_Sql Server_Linq - Fatal编程技术网

C# Linq到SQL可空int?

C# Linq到SQL可空int?,c#,sql-server,linq,C#,Sql Server,Linq,我有以下linq查询(非常简单): folder.FolderID是一个可为空的int(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.

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

folder.FolderID是一个可为空的int(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”和具有null值的对象之间有区别。我只是不知道它是什么以及如何修复它

仅供参考,我有代码,where子句如下所示:

where j.jobmst_type != 1 && j.jobmst_prntid == folder.FolderID
但它也没有产生任何结果


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

我认为您必须在表达式中预先添加
(int?
,才能在空值时工作

j.jobmst_prntid.Equals ( folder.FolderID )
j.jobmst_prntid.Equals ( (int ? ) folder.FolderID )
更多参考:

或者你可以试试这个

 where j.jobmst_type != 1 && j.jobmst_prntid.Equals(folder.FolderID== null ?   null : folder.FolderID)

正如我在评论中提到的:

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

表达式谓词;
if(folder.FolderID==null){
谓词=j=>j.jobmst_prntid==null&&j.jobmst_type!=1;
}否则{
谓词=j=>j.jobmst_prntid==folder.FolderID&&j.jobmst_type!=1;
}
//...
.Where(谓词)
选择新的
{
// ...
}

我最终是为了自己的情况才这样做的:

List<Job> folderJobs = new List<Job>();
var tidalJobs = (dynamic) null;
if (folder.FolderID == 0)
{
    tidalJobs = from 
                    master in tidal.jobmsts
                join
                    detail in tidal.jobdtls
                on
                    master.jobdtl_id equals detail.jobdtl_id
                where 
                    master.jobmst_prntid.HasValue == false && master.jobmst_type != 1
                select new
                {
                    JobID = master.jobmst_id,
                    JobName = master.jobmst_name,
                    Description = master.jobmst_desc == null ? string.Empty : master.jobmst_desc,
                    Source = detail.jobdtl_cmd == null ? string.Empty : detail.jobdtl_cmd
                };
}
else
{
    tidalJobs = from
                    master in tidal.jobmsts
                join
                    detail in tidal.jobdtls
                on
                    master.jobdtl_id equals detail.jobdtl_id
                where 
                    master.jobmst_prntid == folder.FolderID && master.jobmst_type != 1
                select new
                {
                    JobID = master.jobmst_id,
                    JobName = master.jobmst_name,
                    Description = master.jobmst_desc == null ? string.Empty : master.jobmst_desc,
                    Source = detail.jobdtl_cmd == null ? string.Empty : detail.jobdtl_cmd
                };
}

foreach (var folderJob in tidalJobs)
{
    ...
}
List folderJobs=new List();
var tidalJobs=(动态)null;
如果(folder.FolderID==0)
{
tidalJobs=来自
潮汐工程硕士
参加
tidal.jobdtls中的详细信息
在…上
master.jobdtl\u id等于detail.jobdtl\u id
哪里
master.jobmst\u prntid.HasValue==false&&master.jobmst\u type!=1
选择新的
{
JobID=master.jobmst\u id,
JobName=master.jobmst\u name,
Description=master.jobmst\u desc==null?字符串。空:master.jobmst\u desc,
Source=detail.jobdtl\u cmd==null?字符串。空:detail.jobdtl\u cmd
};
}
其他的
{
tidalJobs=来自
潮汐工程硕士
参加
tidal.jobdtls中的详细信息
在…上
master.jobdtl\u id等于detail.jobdtl\u id
哪里
master.jobmst\u prntid==folder.FolderID&&master.jobmst\u type!=1
选择新的
{
JobID=master.jobmst\u id,
JobName=master.jobmst\u name,
Description=master.jobmst\u desc==null?字符串。空:master.jobmst\u desc,
Source=detail.jobdtl\u cmd==null?字符串。空:detail.jobdtl\u cmd
};
}
foreach(tidalJobs中的var folderJob)
{
...
}

简而言之,我需要var tidalJobs=(dynamic)null和.HasValue==false来实现这一点。唯一需要注意的是,将var设置为(动态)null将禁用intellisense b/c所有内容都将在运行时进行评估。因此,您的键入最好是准确无误。

当您执行linq时,SQL Profiler会显示什么?另外-您正在这里构造一个linq查询对象,但没有执行它(至少在您与我们共享的代码中)。请检查:我不熟悉SQL Profiler。db对象是添加到我的项目中的DataClasses1DataContext对象。db.log的输出是“WHERE([t0].[jobmst_type]@p0)和([t0].[jobmst_prntid]=@p1)”,该语法用于join语句中的可空值。我的问题是where子句中的一个可空值。我试过语法,但不起作用。谢谢你。
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
{
    // ...
}
List<Job> folderJobs = new List<Job>();
var tidalJobs = (dynamic) null;
if (folder.FolderID == 0)
{
    tidalJobs = from 
                    master in tidal.jobmsts
                join
                    detail in tidal.jobdtls
                on
                    master.jobdtl_id equals detail.jobdtl_id
                where 
                    master.jobmst_prntid.HasValue == false && master.jobmst_type != 1
                select new
                {
                    JobID = master.jobmst_id,
                    JobName = master.jobmst_name,
                    Description = master.jobmst_desc == null ? string.Empty : master.jobmst_desc,
                    Source = detail.jobdtl_cmd == null ? string.Empty : detail.jobdtl_cmd
                };
}
else
{
    tidalJobs = from
                    master in tidal.jobmsts
                join
                    detail in tidal.jobdtls
                on
                    master.jobdtl_id equals detail.jobdtl_id
                where 
                    master.jobmst_prntid == folder.FolderID && master.jobmst_type != 1
                select new
                {
                    JobID = master.jobmst_id,
                    JobName = master.jobmst_name,
                    Description = master.jobmst_desc == null ? string.Empty : master.jobmst_desc,
                    Source = detail.jobdtl_cmd == null ? string.Empty : detail.jobdtl_cmd
                };
}

foreach (var folderJob in tidalJobs)
{
    ...
}