LINQ-to-SQL中不可通过的子句

时间:2010-03-05 17:22:30

标签: linq linq-to-sql

当我努力学习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);
    }

它返回我想忽略活动部分的票组。

3 个答案:

答案 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 &= ...

仔细考虑这是做什么的:

  • 如果activenull,那么你很好,它会跳到下一个条件。
  • 如果activetrue,则result在条件结束时为true
  • 如果activefalse,则result在条件结束时为false

在最后一种情况下,查询永远不会返回任何行!

@Tanzelax已经提供了一个简单的重写。主要想法是您要将p.activeactive进行比较,而不是将条件实际评估为p.active

答案 2 :(得分:0)

这可能是由您声明为非可空的列中的空值引起的。默认情况下,LINQ2SQL使所有列都不可为空。返回设计器并更改字段以允许值为null。不幸的是,功能 按设计(请参阅下面的connect.microsoft.com链接。)

(linq) incorrect sql generated for row.column == localVar when localVar is null (should be "is null" check)