当我努力学习LINQ时,我设法生成一个带有“AND(0 = 1)”的SQL语句作为where子句的一部分。我只是想知道这个结果是否在写得不好的查询中是常见的,并且是一个已知的问题,试图避免或者我正在做一些完全倒退的事情以最终结果。
更新
public static IEnumerable<ticket> GetTickets(stDataContext db,string subgroup, bool? active)
{
var results = from p in db.tickets
where
( active == null || p.active == active )
/*(active == null ? true :
((bool)active ? p.active : !p.active))*/ &&
p.sub_unit == db.sub_units.Where(c=>subgroup.Contains(c.sub_unit_name))
select p;
return results;
}
如果我忽略了活动部分而只是运行
public static IEnumerable<ticket> GetTickets1(stDataContext db,string subgroup, bool? active)
{
return db.tickets.Where(c => c.sub_unit.sub_unit_name == subgroup);
}
它返回我想忽略活动部分的票组。
答案 0 :(得分:2)
我将处理从三元运算符中拉出来。
where ( active == null || p.active == active )
修改强>
where子句的其余部分看起来也很时髦......为什么不只是做
&& p.sub_unit.sub_unit_name == subgroup
或
&& subgroup.Contains(p.sub_unit.sub_unit_name)
答案 1 :(得分:2)
这是对三元运营商的一些相当严重的滥用。
这个表达式:
(active == null ? true :
((bool)active ? p.active : !p.active))
等同于以下逻辑:
bool result;
if (active == null)
{
result = true;
}
else
{
if ((bool)active)
{
result = p.active;
}
else
{
result = !p.active;
}
}
result &= ...
仔细考虑这是做什么的:
active
是null
,那么你很好,它会跳到下一个条件。active
为true
,则result
在条件结束时为true
。active
为false
,则result
在条件结束时为false
。在最后一种情况下,查询永远不会返回任何行!
@Tanzelax已经提供了一个简单的重写。主要想法是您要将p.active
与active
进行比较,而不是将条件实际评估为p.active
。
答案 2 :(得分:0)
这可能是由您声明为非可空的列中的空值引起的。默认情况下,LINQ2SQL使所有列都不可为空。返回设计器并更改字段以允许值为null。不幸的是,功能 按设计(请参阅下面的connect.microsoft.com链接。)