在LINQ To SQL查询中针对位字段计算布尔值

时间:2010-09-10 02:31:03

标签: linq-to-sql sql-server-ce

我正在尝试针对SQL CE数据库执行简单的LINQ To SQL查询。

var result = from item in items
             where item.IsTrue == true
             select item;

问题是IsTrue属性是数据库中的bit字段(CLR中的bool)。当它进入CE中的SQL时我获得SELECT ... WHERE ([t0].IsTrue = 1).. 1值是SqlCe的整数,默认情况下它不会抛出它。

我没有使用该列上的索引(IsTrue列)。相反,它会尝试将数据库中的所有istrue值转换为整数,并将它们与1进行比较。

如何让LINQ To SQL生成WHERE ([t0].IsTrue = Cast(1 as bit))...?我需要以某种方式强制将该值转换为bit,从而允许使用索引?

我试过了:

  • item.IsTrue == Convert.ToBoolean(1)
  • item.IsTrue == Convert.ToBoolean("true")
  • item.IsTrue == (bool)true)

希望让表达式树在其中有一个强制转换,以便它转换为LINQ To SQL中的强制转换,但我似乎无法找到方法。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

我登陆此页面是因为我遇到了同样的问题。

我发现你可以通过使用编译查询解决这个特殊的破坏问题。要使用您的示例:

DataContext context = /* ... */;

Func <DataContext, IQueryable<ItemType> compiledQuery = null;

compiledQuery = CompiledQuery.Compile(
   (DataContext ctx) => (from item in Items
                         where item.IsTrue
                         select item)
);

var result = compiledQuery(context);

如果你查看它生成的SQL(通过挂钩DataContext中的日志流),由于某种原因,使用非编译查询的正确事情是不正确的。您的bool s中的索引将开始工作。

答案 1 :(得分:0)

您是否尝试过== true部分而只是使用

var result = from item in items where item.IsTrue select item;

或者,使用method syntax

var result = items.Where(item => item.IsTrue);