Linq to sql 在LINQ To SQL查询中根据位字段计算布尔值

Linq to sql 在LINQ To SQL查询中根据位字段计算布尔值,linq-to-sql,sql-server-ce,Linq To Sql,Sql Server Ce,我正在尝试对SQLCE数据库执行一个简单的LINQ到SQL查询 var result = from item in items where item.IsTrue == true select item; 问题是IsTrue属性是CLR中数据库bool中的一个位字段。当它转到CE中的SQL时,我得到SELECT。。。式中[t0]。IsTrue=1。。1值是SqlCe的整数,默认情况下不会强制转换它 我在该列上的索引IsTrue列没有被使用。相

我正在尝试对SQLCE数据库执行一个简单的LINQ到SQL查询

var result = from item in items
             where item.IsTrue == true
             select item;
问题是IsTrue属性是CLR中数据库bool中的一个位字段。当它转到CE中的SQL时,我得到SELECT。。。式中[t0]。IsTrue=1。。1值是SqlCe的整数,默认情况下不会强制转换它

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

如何让LINQ到SQL生成WHERE[t0].IsTrue=Cast1作为位。。。?我需要以某种方式强制转换该值,从而允许使用索引

我试过:

item.IsTrue==Convert.ToBoolean1 item.IsTrue==Convert.ToBooleantrue item.IsTrue==booltrue
希望让表达式树有一个强制转换,这样它就可以转换为LINQ到SQL中的强制转换,但我似乎找不到方法。有什么想法吗?

你有没有试过省去==真正的部分,只使用

var result=项目中的项目,其中item.IsTrue选择项目

或者,使用:


var result=items.Whereitem=>item.IsTrue

我登陆这个页面是因为我有同样的问题

我发现您可以通过使用编译查询来解决这种特殊的中断问题。要使用您的示例:

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);

如果您查看它通过在DataContext中连接日志流而生成的SQL,那么出于某种原因,它会在使用未编译查询时做正确的事情。你的索引中有布尔值将开始工作。

是的,我也尝试过,但它仍然在sql中添加了=1。我知道这已经是6年后的事了,但实体框架现在正在进行转换。至少对我来说是这样。