如果使用null检查LINQ2SQL不返回行(LINQ2SQL doesn't return row if checking with null)

系统教程 行业动态 更新时间:2024-06-14 16:58:00
如果使用null检查LINQ2SQL不返回行(LINQ2SQL doesn't return row if checking with null)

我有以下LINQ2SQL查询:

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

所有类型都是字符串。

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

当value="0", controlledParamId =null and FacilityId ="abc"此查询返回null,但是当我写下面的内容时:

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

测试不是null

我究竟做错了什么?

PS我也试过c.DriverControlledParameterId.Equals(controlledParamId)但它也不起作用。

I have following LINQ2SQL Query:

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

All the types are string.

In my DB i have a row, which must be returned by query.

When value="0", controlledParamId =null and FacilityId ="abc" this query returns null, but when i wrote following:

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

test was not null

What am i doing wrong?

P.S. I also tried c.DriverControlledParameterId.Equals(controlledParamId) but it also doesn't work.

最满意答案

问题是,LINQ2SQL对表达式c.DriverControlledParameterId == null进行了特殊处理。 它被转换为SQL DriverControlledParameterId IS NULL 。 但是c.DriverControlledParameterId = controlledParamId被转换为SQL DriverControlledParameterId = :p1 ,即使controlledParamId为null 。 并且在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更具可读性,并且没有像第一个那样重复的代码。

The problem is, that LINQ2SQL has a special handling for the expression c.DriverControlledParameterId == null. It is translated to the SQL DriverControlledParameterId IS NULL. But c.DriverControlledParameterId = controlledParamId is translated to the SQL DriverControlledParameterId = :p1, even when controlledParamId is null. And in SQL DriverControlledParameterId = NULL is undefined and as such never TRUE.

How to fix: Handle the null case specifically:

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");

Or like this:

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

Or like this:

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();

That third option is what I would use. In my opinion, this is the more readable than option 2 and has no repeated code like the first one.

更多推荐

本文发布于:2023-04-14 05:21:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/dzcp/b6ca4af4797361081dd49fceca7836bf.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:LINQ2SQL   null   return   checking   row

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!