c# - 谁能解释一下以下两个查询的区别?

标签 c# .net linq linq-to-sql sqlmetal

我正在使用 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);

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

谁能解释一下区别?

编辑:

旁注:

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

最佳答案

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

您必须检查 sql 事件探查器以查看执行的实际查询是什么,以了解有何不同。您的数据库中是否有任何可为空的列可能是问题所在?

更新

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

_dataContext.StaticPageLangs
    .FirstOrDefault(r => r.selected_partial_url_id == partialUrlid)

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

关于c# - 谁能解释一下以下两个查询的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11649648/

相关文章:

c# - 如何将值从 xaml 传递给构造函数?

c# - 在 WinRT 中加载图像文件

.net - 引用Microsoft.SqlServer.Smo.dll

c# - 为什么 C# 包含不符合 CLS 的编程结构?

c# - EF 6 - 包括为什么我没有 linq 选择?

c# - 使用 LINQ 将类的字段复制到字典列表中

c# - 使用同一个程序集多次调用 Assembly.Load(AssemblyName) 有什么缺点?

c# - System.Array 真的实现了 ICollection 吗?

c# - RabbitMQ WCF 如何容忍服务失败?

c# - 如何使用 linq 将 IEnumerable 转换为 Collection