这是我的linq查询:
var test = from m in db.Members where m.UserId == null select m.Id;
test.ToList();
UserId是成员表上可以为空的Guid字段,对应于ASP.NET成员资格表aspnet_member。我无法通过亚音速生成一个查询,该查询将选择userid IS为null的位置,仅在它不为空的位置。
这是我的预期输出:
SELECT Id FROM Member WHERE UserId IS NULL
这是我的实际输出:
SELECT Id FROM Member WHERE UserId IS **NOT** NULL
有什么想法?我正处于调试过程中,但也许其他人遇到了这个问题。
答案 0 :(得分:1)
原来在VisitBinary方法中没有实现ExpressionType.Equals。最近有一个补丁可以在这里找到:
旧代码是:
case ExpressionType.Equal:
case ExpressionType.NotEqual:
if (right.NodeType == ExpressionType.Constant)
{
ConstantExpression ce = (ConstantExpression)right;
if (ce.Value == null)
{
this.Visit(left);
sb.Append(" IS NOT NULL");
break;
}
}
else if (left.NodeType == ExpressionType.Constant)
{
ConstantExpression ce = (ConstantExpression)left;
if (ce.Value == null)
{
this.Visit(right);
sb.Append(" IS NOT NULL");
break;
}
}
goto case ExpressionType.LessThan;
为Equal添加了实施。除了发出IS NULL而不是IS NOT NULL之外,它与NotEqual非常相似。