C# 有人能解释一下以下两个问题的区别吗?
我正在使用SqlMetal(linq到sql)从数据库中检索内容。 但是,我使用以下代码得到不同的结果:C# 有人能解释一下以下两个问题的区别吗?,c#,.net,linq,linq-to-sql,sqlmetal,C#,.net,Linq,Linq To Sql,Sqlmetal,我正在使用SqlMetal(linq到sql)从数据库中检索内容。 但是,我使用以下代码得到不同的结果: var record1 = Enumerable.FirstOrDefault(_dataContext.StaticPageLangs, r => r.selected_partial_url_id == partialUrlid && r.selected_last_part_url_id == las
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是空的,我希望它们是相同的
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);
有人能解释一下区别吗
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);
编辑:
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);
旁注:
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);
r、 所选的\u partial\u url\u id是可为空的int,因此要比较的属性也是可为空的int
r、 所选的\u last\u part\u url\u id的类型为int,所比较的属性也是int
r、 语言id的类型为int,要比较的属性的类型为int。由于您使用的是Enumerable.FirstOrDefault(…),因此第一个查询在内存中完成。
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);
第二个查询由数据上下文转换为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);
您必须检查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);
更新
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);
如果您在一个被转换为SQL语句的表达式中比较可为null的属性,请注意,如果比较的两个值都为null,则这可能会出错。例如:
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);
_dataContext.StaticPageLangs
.FirstOrDefault(r => r.selected_partial_url_id == partialUrlid)
如果partialUrlid==NULL,并且存在一个选中的_partial_url_id==NULL的记录,则不会生成任何记录。原因:翻译后的sql包含“selected\u partial\u url\u id==NULL”和“selected\u partial\u url\u id为NULL”两个词。注意:以下答案适用于
record1
为NULL
和record2
为非NULL
,这与问题相反,但对其他具有类似场景的读者可能有用
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);
如果让我猜的话,其中至少有一个=
位于字符串上,这是一个区分大小写的问题
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);
record1
来自LINQ到对象,因此它从服务器中提取所有行,并在本地测试它们。然后,这些=
是区分大小写的(字符串上的C#/.NET=
始终区分大小写)
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);
record2
看起来像是通过IQueryable
使用数据库实现。这意味着它正在被转换为TSQL。SQL Server数据库可以区分大小写,也可以不区分大小写。我猜您已将其设置为不区分大小写
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);
现在,假设languageId
在C#中是“en-us”
,在数据库中是“en-us”
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);
这可能导致record1
为null
,但record2
被填充。。对于这一点,Nullables是一个巨大的痛苦。我甚至可以说LINQ to SQL提供程序只是弄错了。EF仍然不能正确处理where表达式“(可为null的属性)==(可为null的变量)”。我将数据类型编辑到我的问题中,并且需要比较一个可为null的int。我必须看看正在执行的是什么我认为OP是关于可枚举的。FirstOrDefault(无论什么,谓词)
和无论什么。FirstOrDefault(谓词)
我编辑了我比较的参数类型,它们都不是字符串。我好像更新了你的答案我错了(目的是更新我自己的答案)。审阅者,请拒绝我的更新!
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);