有一个表,表中有一个字段 status,类型为int,不可为空。
目前在使用中,仅对这个字段做启用与禁用处理(类似bit的功能,但考虑到今后扩展,没修改类型),为了方便使用,在构建LINQ对象的时候,对status的访问性设置为private进行隐藏,然后定义一个属性Enable来替代这个字段的使用:
public bool Enable
{
get{return this.status>0;}
set{this.status=value?1:0;}
}
在写LINQ语句的时候使用条件:
Where(item=>item.Enable)
运行报告错误,提示没办法将这个条件转换为有效的SQL语句。
类似的问题该怎么解决?是否有其它类似的解决方案满足这个需求?
在Enable上面添加适当的属性就可以解决你的问题,如下:
private int _Status;
[Column(Storage = "_Status", DbType = "Int NOT NULL", Name="Status")]
public bool Enabled
{
get
{
return this._Status == 1;
}
set
{
this._Status = value ? 1 : 0;
}
}
关键是Name属性定义了列名,这样就可以生成正确的SQL语句。
感谢回复!除了这个方案之外,是否还有别的方案,使得enable只是普通的属性,而status是另外的?
因为,在以后,可能会有:
1——
1——
对STATUS保留STATUS的功能(不同的值有不同的意义)
2——
同时增加一个ENABLE属性,该属性变成只读属性,用于判断是否启用(只要大于0就是启用)
再次感谢!
@笨笨蜗牛:
第1点,让Status保留多个值是可以的,可以仿Enabled定义一个public Status属性就可以了。即让Enabled和Status都对应"Status"列。
但第2点,让Enable变成一个普通的属性应该不行,因为LINQ to SQL无法根据非Column属性来生成sql script。不管怎样,就像上面这样用Enabled属性也能满足你的要求,set里面改为this._Status = value > 0 ? 1 : 0;
@Life a Poem:
感谢。使用的时候报告错误:
参数“value”的类型不正确。需要为“bool”,实际为“System.Int32”。
应该是对ENABLE进行赋值的时候导致的。
@笨笨蜗牛:
客气了,能把相关代码贴完整一点吗?因为我这边错误信息不一样,不好判断问题出在哪儿。
@Life a Poem:
感谢!刚实验了下,终于发现问题了:
你的方案要跟PURSUEZHANG的方案结合,对PURSUEZHANG的方案我以为只对普通的字段进行操作。
不过,在调试的时候发现一个新的问题:
当我写代码
Where(item => item.Enable==true)
的时候,跟踪生成的COMMAND对应的PARAMETER,发现值为1,而我想判断的是>0。
有别的方案解决不?
@笨笨蜗牛:
是的,Enable为bool类型,所以L2S生成Status = 1的script。
要生成Status > 0这样的script,就必须要保证属性的类型为int。
感觉这样子比较乱呀,建议你在L2S查询中直接用Status属性,在非查询时可以使用Enable来做一些简化。即定义两个属性:
private int _Status;
[Column(DbType = "Int NOT NULL", Name = "Status")]
public int Status
...
public bool Enabled
...
Where(item=>item.Enable==true)
不支持这个转换的。
@笨笨蜗牛: item.Enable这个是bool值啊。如果不行就写,from in where select的这种。
@PursueZhang:
“from in where select ”里的条件不过是Where函数的语句表现形式。
@笨笨蜗牛: 是啊,但是跟灵活。