针对 LINQ To SQL 查询中的位字段评估布尔值

Posted

技术标签:

【中文标题】针对 LINQ To SQL 查询中的位字段评估布尔值【英文标题】:evaluating a boolean against a bit field in LINQ To SQL query 【发布时间】:2010-09-10 02:31:02 【问题描述】:

我正在尝试针对 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 中转换为强制转换,但我似乎找不到方法。有什么想法吗?

【问题讨论】:

我知道这是 6 年后的事了,但现在 Entity Framework 正在为 bit 进行转换。至少对我来说是这样。 【参考方案1】:

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

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

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 中的日志流),它出于某种原因在使用非编译查询时会做正确的事情。包含bools 的索引将开始工作。

【讨论】:

【参考方案2】:

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

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

或者,使用method syntax:

var result = items.Where(item =&gt; item.IsTrue);

【讨论】:

是的,我也试过了,但它仍然在 sql 中添加了“= 1”。

以上是关于针对 LINQ To SQL 查询中的位字段评估布尔值的主要内容,如果未能解决你的问题,请参考以下文章

LinQ to SQL 查询

为啥 Linq-to-sql 错误地删除了我的联合中的字段?

怎么用linq to sql 写单表多字段的模糊查询方法

如何编写这个 Linq-to-SQL 选择查询

利用linq to sql 建立查询方法返回值类型为List<T> 怎样去除集合中的重复数据?

C# 中的 LINQ to SQL 查询