gpt4 book ai didi

c# - 如果使用 null 检查,LINQ2SQL 不会返回行

转载 作者:行者123 更新时间:2023-12-02 21:49:08 26 4
gpt4 key购买 nike

我有以下 LINQ2SQL 查询:

var map =
dbContext.TCPDriverMappings.FirstOrDefault(
c => c.DriverFacilityId == tcpDms.FacilityId &&
c.DriverControlledParameterId == controlledParamId &&
c.DriverValue == value);

所有类型都是字符串。

在我的数据库中,我有一行,必须通过查询返回。

value="0"、controlledParamId =null 且 FacilityId ="abc" 时,此查询返回 null,但当我编写以下内容时:

var test = dbContext.TCPDriverMappings.FirstOrDefault(
c => c.DriverFacilityId == "abc" &&
c.DriverControlledParameterId == null &&
c.DriverValue == "0");

测试不为空

我做错了什么?

附注我还尝试了 c.DriverControlledParameterId.Equals(controlParamId) 但它也不起作用。

最佳答案

问题是,LINQ2SQL 对表达式 c.DriverControlledParameterId == null 有特殊处理。它被转换为 SQL DriverControlledParameterId IS NULL
但是,即使 controlledParamIdnullc.DriverControlledParameterId = controlParamId 也会转换为 SQL DriverControlledParameterId = :p1。在 SQL 中,DriverControlledParameterId = NULL 未定义,因此永远不会 TRUE

如何修复:专门处理null情况:

TCPDriverMapping test;
if(controlledParamId == null)
test = dbContext.TCPDriverMappings.FirstOrDefault(
c => c.DriverFacilityId == "abc" &&
c.DriverControlledParameterId == null &&
c.DriverValue == "0");
else
test = dbContext.TCPDriverMappings.FirstOrDefault(
c => c.DriverFacilityId == "abc" &&
c.DriverControlledParameterId == controlledParamId &&
c.DriverValue == "0");

或者像这样:

var test = dbContext.TCPDriverMappings.FirstOrDefault(
c => c.DriverFacilityId == "abc" &&
((controlledParamId == null &&
c.DriverControlledParameterId == null) ||
c.DriverControlledParameterId == controlledParamId) &&
c.DriverValue == "0");

或者像这样:

IQueryable<TCPDriverMapping> query =
dbContext.TCPDriverMappings.Where(c => c.DriverFacilityId == "abc" &&
c.DriverValue == "0");
if(controlledParamId == null)
query = query.Where(c => c.DriverControlledParameterId == null);
else
query = query.Where(c => c.DriverControlledParameterId == controlledParamId);

var test = query.FirstOrDefault();

我会使用第三个选项。在我看来,这比选项 2 更具可读性,并且没有像第一个那样的重复代码。

关于c# - 如果使用 null 检查,LINQ2SQL 不会返回行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19005593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com