当前位置: 首页 > 面试题库 >

LINQ和SQL中看似等效的查询返回不同的结果

柏正平
2023-03-14
问题内容

不知道为什么将其链接为骗子。 问题是不同的。答案是不同的。不知道要更改什么。如果有人看到我想念的东西,请告诉我…

使用这两个查询,我得到的结果数量不同。在分析了几个小时之后,我需要扔掉毛巾,承认我无法发现重要性的差异。由于我的方法库已空荡荡,因此我需要帮助。

LINQ

List<Uno> result = context.Unos
  .Join(context.Duos, uno => uno.CommonId, duo => duo.CommonId,
    (uno, duo) => new { Uno = uno, Duo = duo })
  .Where(item => item.Uno.Amount > 0
    && item.Duo.Type == 2)
  .Select(item => item.Uno)
  .ToList();

SQL

select * from Uno as u
join Duo as d on d.CommonId = u.CommonId
where u.Amount > 0
  and d.Type = 2

第一个问题是上述两个陈述是否确实相等,或者我是否缺少某些内容。第二个问题是我所缺少的(如果有的话)或如何解决它(如果我没有的话)。

  1. 调用是针对同一数据库的。
  2. 结果的数量相差很大(142和1437)。
  3. 对于内部联接,将提取相同的结果集。
  4. 无论 乌诺双核 的看法,并不表。

我还能验证什么?

在社区的大力支持下,我们确定可以通过以下命令对LINQ查询进行SQL化。

var wtd = context.Unos
  .Join(context.Duos, uno => uno.CommonId, duo => duo.CommonId,
    (uno, duo) => new { Uno = uno, Duo = duo })
  .Where(item => item.Uno.Amount > 0
    && item.Duo.Type == 2)
  .Select(item => item.Uno)
  .ToString();

疯狂的事情是,在SQL Manager中执行
字符串会产生142个结果(就像上面示例中的查询一样,是SQL版本),并且与它的区别不大。但是,执行LINQ查询本身会产生1437个结果。我太困惑了,甚至不敢哭泣…

“SELECT \r\n [Extent1].[CommonId] AS [CommonId], \r\n [Extent1].[X] AS [X]\r\n FROM (SELECT \n [Uno].[CommonId] AS [CommonId], \n [Uno].[X] AS [X]\n FROM [Finance].[Uno] AS [Uno]) AS [Extent1]\r\n INNER JOIN (SELECT \n [Duo].[CommonId] AS [CommonId], \n [Duo].[Y] AS [Y], \n [Duo].[Z] AS [Z], \n [Duo].[Type] AS [Type], \n [Duo].[U] AS [U], \n [Duo].[V] AS [V]\n FROM [Finance].[Duo] AS [Duo]) AS [Extent2] ON [Extent1].[CommonId] = [Extent2].[CommonId]\r\n WHERE ([Extent1].[X] > cast(0 as decimal(18))) AND ([Extent2].[Type] = @p__linq__0)”


问题答案:

在Entity
Framework中映射视图时,经常会发生这种情况。与常规数据库表不同,视图通常没有明显唯一的键值。当EF遇到具有相同主键值的行时,它仅复制属于它已经知道的键的行。在联接中,这可能会导致EF产生更多的子记录,因为该第一个已知行的子记录可能比实际数据库行的子记录更多。

解决方法是确保视图具有唯一标识行的字段(或字段组合)。而且,当然,在EF中,应将此映射为(可能是复合的)主键。

我不知道为什么EF会显示这种行为。我认为它应该有可能引发使重复实体具体化的异常。这种“功能”总是引起很多混乱。



 类似资料:
  • 问题内容: 我的SQL代码如下: 等效的linq表达式是什么? 问题答案: 我第一次尝试在 来源 LINQ to SQL中的NOT IN子句

  • 我正在尝试运行一个in查询(springboot jpa mysql)。我已经启用了调试日志,查询似乎很好,但是SpringJPA没有返回任何结果。 以下是配置: 这是我的存储库: //或 这里需要注意的是,“in”查询中的列不是主键。 生成的查询:

  • 我有下面的SQL查询,我在flink工作中使用。< code>mysql_table是使用JDBC连接器创建的,而< code>kafa_source表是从传入的kafka流创建的。 我在两者之间执行时态连接,当我在Flink的sql-client CLI中检查时,运行良好(用< code>flink-faker测试)。内部查询工作得非常好,并且正在打印结果。有人能帮助我找出这个问题吗? 编辑:我

  • Spark 1.3.1(也尝试了Spark 1.5.1) Hadoop 2.6(在CDH 5.4.0上) Pyspark--主纱--num--执行者5--执行者-内存10g--驱动程序-内存4g--驱动程序-核心4 database.table有超过2k个分区 database.table在field1上分区(在where子句中使用) 占用的时间不确定--我不得不停止查询的执行,因为它很快占用了我

  • 文档: 操作: 合作伙伴: HQL(“INCASAT”=“兑现”,“VANDUT”=“出售”):

  • 问题内容: 在django中,此SQL语句的等效项是什么? 如何在Django中实现呢?我试过了 但这是行不通的。我该如何执行呢? 问题答案: 使用或(不区分大小写): SQL等效为