首页 新闻 会员 周边 捐助

这样的LINQ 2 SQL语句该怎么写!

0
悬赏园豆:40 [已解决问题] 解决于 2012-03-09 16:31

有一个表,表中有一个字段 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语句。

 

类似的问题该怎么解决?是否有其它类似的解决方案满足这个需求?

无之无的主页 无之无 | 大侠五级 | 园豆:5095
提问于:2011-12-22 09:32
< >
分享
最佳答案
1

在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语句。

收获园豆:20
Life a Poem | 菜鸟二级 |园豆:437 | 2011-12-22 09:57

感谢回复!除了这个方案之外,是否还有别的方案,使得enable只是普通的属性,而status是另外的?

因为,在以后,可能会有:

1——

无之无 | 园豆:5095 (大侠五级) | 2011-12-22 11:00

1——

对STATUS保留STATUS的功能(不同的值有不同的意义)

2——

同时增加一个ENABLE属性,该属性变成只读属性,用于判断是否启用(只要大于0就是启用)

 

再次感谢!

无之无 | 园豆:5095 (大侠五级) | 2011-12-22 11:01

@笨笨蜗牛: 

第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 | 园豆:437 (菜鸟二级) | 2011-12-22 13:21

@Life a Poem: 

感谢。使用的时候报告错误:

 

参数“value”的类型不正确。需要为“bool”,实际为“System.Int32”。

 

应该是对ENABLE进行赋值的时候导致的。

无之无 | 园豆:5095 (大侠五级) | 2011-12-22 14:41

@笨笨蜗牛: 

客气了,能把相关代码贴完整一点吗?因为我这边错误信息不一样,不好判断问题出在哪儿。

Life a Poem | 园豆:437 (菜鸟二级) | 2011-12-22 18:48

@Life a Poem: 

感谢!刚实验了下,终于发现问题了:

你的方案要跟PURSUEZHANG的方案结合,对PURSUEZHANG的方案我以为只对普通的字段进行操作。

 

不过,在调试的时候发现一个新的问题:

当我写代码

Where(item => item.Enable==true)

的时候,跟踪生成的COMMAND对应的PARAMETER,发现值为1,而我想判断的是>0。

有别的方案解决不?

无之无 | 园豆:5095 (大侠五级) | 2011-12-23 08:58

@笨笨蜗牛: 

是的,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
...

Life a Poem | 园豆:437 (菜鸟二级) | 2011-12-23 15:40
其他回答(1)
1

Where(item=>item.Enable==true)

收获园豆:20
悟行 | 园豆:12559 (专家六级) | 2011-12-22 13:09

不支持这个转换的。

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2011-12-22 14:43

@笨笨蜗牛: item.Enable这个是bool值啊。如果不行就写,from  in  where select的这种。

支持(0) 反对(0) 悟行 | 园豆:12559 (专家六级) | 2011-12-22 15:01

@PursueZhang: 

“from in where select ”里的条件不过是Where函数的语句表现形式。

 

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2011-12-22 15:12

@笨笨蜗牛: 是啊,但是跟灵活。

支持(0) 反对(0) 悟行 | 园豆:12559 (专家六级) | 2011-12-22 18:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册