有谁可以解释我在以下2个查询中的区别?

Rob*_*bin 2 .net c# linq sqlmetal linq-to-sql

我正在使用SqlMetal(linq to sql)来从数据库中检索内容.但是,我使用以下代码得到不同的结果:

var record1 = Enumerable.FirstOrDefault(_dataContext.StaticPageLangs, 
              r => r.selected_partial_url_id == partialUrlid 
                && r.selected_last_part_url_id == lastPartUrlId 
                && r.language_id == languageId);

var record2 = _dataContext.StaticPageLangs.FirstOrDefault(
              r => r.selected_partial_url_id == partialUrlid
                && r.selected_last_part_url_id == lastPartUrlId
                && r.language_id == languageId);
Run Code Online (Sandbox Code Playgroud)

在记录1填充后,但record2为NULL,我希望它们是相同的.

谁有人解释这个区别?

编辑:

旁注:

r.selected_pa​​rtial_url_id是一个可以为null的int,因此被比较的属性r.selected_last_part_url_id属于int类型,因此被比较的属性r.language_id属于int类型,因此被比较的属性

Maa*_*ten 5

由于您使用的是Enumerable.FirstOrDefault(...),因此第一个查询在内存中完成.第二个查询由数据上下文转换为SQL,并由数据库执行.

您必须检查sql profiler以查看执行的实际查询是什么,以查看区别.数据库中任何可以为空的列都可能出现问题?

UPDATE

如果比较转换为SQL语句的表达式中的可空属性,请注意如果比较的两个值都为null,则可能会出错.例:

_dataContext.StaticPageLangs
    .FirstOrDefault(r => r.selected_partial_url_id == partialUrlid)
Run Code Online (Sandbox Code Playgroud)

如果partialUrlid == NULL并且存在selected_pa​​rtial_url_id == NULL的记录,则不会产生任何记录.原因:翻译的sql包含'selected_pa​​rtial_url_id == NULL'而不是'selected_pa​​rtial_url_id IS NULL'.