繁体   English   中英

LINQ to SQL查询基于使用外键还是使用内置导航属性而成功或失败

[英]LINQ to SQL query succeeds or fails based on using foreign key versus using a built in navigation property

我有一个针对SQL Server数据库的查询,该查询引发Error converting data type nvarchar to numeric. 例外。 我试图在varchar字段上使用Convert.ToDecimal ,但是我将尽我所能地盯着数据,并且也找不到无效的值。

该查询正在使用p.pgKey=#的外键按“组”过滤表。 但是,如果我使用导航属性并改为按导航属性过滤,则p.Group.gName='ABC'可以运行查询。

这是查询(请注意,最初,我不知道在Where翻译或Select处理中是否发生错误,因此这就是查询看起来很奇怪的原因,但是您可以猜测,当它起作用时,它应该只返回一个true不同行):

Profiles
    .Where(p =>
       p.pgKey == 237
       && !p.pPlanProfile.Value
      && Convert.ToDecimal(p.pSearch08 ?? "0") > 0
    ).Select(p =>
       Convert.ToDecimal(p.pSearch08 ?? "0") > 0
    )
    .Distinct()
    .Dump();

以上查询失败,而该查询成功:

Profiles
    .Where(p =>
       p.Groups.gName == "ABC"
       && !p.pPlanProfile.Value
       && Convert.ToDecimal(p.pSearch08 ?? "0") > 0
    ).Select(p =>
       Convert.ToDecimal(p.pSearch08 ?? "0") > 0
    )
    .Distinct()
    .Dump();

下面是完整的LINQPad屏幕转储,显示:

  1. 证明ABC的gKey为237。
  2. 证明使用pgKeyGroup.gName时, pgKey统计Profile记录的计数是相同的。
  3. 显示使用Group.gName处理时查询正常工作。
  4. 使用pgKey处理时显示查询失败。

LINQPad屏幕截图

显然,我已经使用Group.gName方法解决了我的问题,但是偶然发现了该解决方案。 有人知道为什么LINQ to SQL会这样吗?

注意 :使用LINQPad生成的DataContext或针对编译的.dbml DataContext运行时,我会得到相同的行为。

这两个查询将生成不同的TSQL,因此查询计划将不同。

我怀疑前一个查询试图将pSearch08的某些值转换为十进制, 然后才根据其他选择条件拒绝它们,而后一个查询首先执行其他选择条件,因此尝试转换较少的pSearch08值转换为十进制,因此不会尝试转换无效值。

如果是这种情况,那么假设第二个查询将始终有效,则最好进行修复,以修复无效数据。

不必盯着数据,您可以尝试

SELECT * from Profile where ISNUMERIC(pSearch08) = 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM