不可访问的Where子句LINQ to SQL

不可访问的Where子句LINQ to SQL,linq,linq-to-sql,Linq,Linq To Sql,在我努力学习LINQ的过程中,我成功地在where子句中使用AND 0=1生成了一条SQL语句。我只是想知道这种结果是否在写得不好的查询中很常见,并且是一个需要尝试和避免的已知问题,或者我是否在做一些完全相反的事情来结束这种情况 更新 public static IEnumerable<ticket> GetTickets(stDataContext db,string subgroup, bool? active) { var results = from

在我努力学习LINQ的过程中,我成功地在where子句中使用AND 0=1生成了一条SQL语句。我只是想知道这种结果是否在写得不好的查询中很常见,并且是一个需要尝试和避免的已知问题,或者我是否在做一些完全相反的事情来结束这种情况

更新

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

它返回我希望忽略活动部分的票证组。

我将从三元运算符中提取处理

where ( active == null || p.active == active )
编辑

where子句的其余部分看起来也很时髦。。。为什么它不只是在做

&& p.sub_unit.sub_unit_name == subgroup


我将从三元运算符中提取处理

where ( active == null || p.active == active )
编辑

where子句的其余部分看起来也很时髦。。。为什么它不只是在做

&& p.sub_unit.sub_unit_name == subgroup


这可能是由于您声明为不可空的列中的一个空值造成的。默认情况下,LINQ2SQL使所有列都不可为空。返回设计器并更改字段以允许值为null。不幸的是,此功能是设计的,请参见下面的connect.microsoft.com链接


这可能是由于您声明为不可空的列中的一个空值造成的。默认情况下,LINQ2SQL使所有列都不可为空。返回设计器并更改字段以允许值为null。不幸的是,此功能是设计的,请参见下面的connect.microsoft.com链接


这是对三元运算符的严重滥用

这句话:

(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,则条件结束时的结果为true。 如果active为false,则条件结束时的结果为false。 在最后一种情况下,查询永远不能返回任何行


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

这是对三元运算符的严重滥用

这句话:

(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,则条件结束时的结果为true。 如果active为false,则条件结束时的结果为false。 在最后一种情况下,查询永远不能返回任何行


@Tanzelax已经提供了一个简单的重写。主要的想法是,您希望比较p.active和active,而不是实际将条件计算为p.active。

LINQ查询是什么样子的?我的猜测是,他得到了一些计算结果为Stuff.Wherefalse的东西。但是,是的,看到LINQ会很好。它会这样做吗?如果要运行查询,那么会返回哪些列?我将LINQ归结为导致1=0的语句。。var results=来自db.tickets中的p,其中p.sub_unit==db.sub_units。其中c=>subgroup.Containsc.sub_unit_name选择p;票证有一个FK到sub_单位,我有一个sub_单位名称子组,我要搜索它。有多个具有不同ID但名称相同的sub_单元,我正试图收回这些单元的门票。我已经玩了很多次了,这让我意识到我可能需要发布完整的LINQ声明,因为它可以简化到足以在不解决我的问题的情况下工作。我在上面添加代码LINQ查询是什么样子的?我的猜测是他得到了一个计算结果为Stuff.Wherefalse的东西。但是,是的,看到LINQ会很好。它会这样做吗?如果要运行查询,那么会返回哪些列?我将LINQ归结为导致1=0的语句。。var results=来自db.tickets中的p,其中p.sub_unit==db.sub_units。其中c=>subgroup.Containsc.sub_unit_name选择p;票证有一个FK到sub_单位,我有一个sub_单位名称子组,我要搜索它。有多个具有不同ID但名称相同的sub_单元,我正试图收回这些单元的门票。我已经玩了很多次了,这让我意识到我可能需要发布完整的LINQ声明,因为它可以简化到足以在不解决我的问题的情况下工作。我在上面添加代码是的,这是开源代码,所以我没有写这一行,或者仔细看清楚。自从Tanzelax发了这条消息我就一直在笑。我会更新上面的代码以反映变化。是的,这是开源代码,所以我没有写那行代码,或者仔细看清楚。自从Tanzelax发了这条消息我就一直在笑。我将更新上述代码以反映更改。