我有一个具有以下架构的表:
create table test
(
foo1 nvarchar(4),
foo2 nvarchar(30)
)
create unique index test_foo1 on test (foo1);
当使用EF实体创建实体时,它会生成一个类,如:
public class Test
{
public string foo1 {get; set;}
public string foo2 {get; set;}
}
因此,在编辑该记录时,我将像下面那样构建动态表达式树,以查找是否存在用于实际编辑的数据库记录:
Expression combinedExpression = null;
foreach (string propertyName in keyColumnNames)
{
var propertyInfo = typeof(Entity).GetProperty(propertyName);
var value = propertyInfo.GetValue(entityWithKeyFieldsPopulated);
var type = propertyInfo.PropertyType;
Expression e1 = Expression.Property(pe, propertyName);
Expression e2 = Expression.Constant(value, type);
Expression e3 = Expression.Equal(e1, e2);
if (combinedExpression == null)
{
combinedExpression = e3;
}
else
{
combinedExpression = Expression.AndAlso(combinedExpression, e3);
}
}
return combinedExpression;
每当我编辑实体“ Test”并向属性foo1提供“ null”时,通过执行此操作,就将数据库查询为“ select * from test where foo1 == null”。如何构建实际上创建where子句的表达式,例如“从test * foo1为null的地方选择”?
答案 0 :(得分:0)
由于foo1 is null
在唯一索引中,因此查询处理器可能没有生成foo1
表达式。它不会为null,因此不会生成该表达式。
我有一些表的列声明为不可空,并且where x.column == null
会在其位置生成where 0 = 1
。它知道这将永远是不正确的。也许在这里发生了同样的事情?