针对 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
中的日志流),它出于某种原因在使用非编译查询时会做正确的事情。包含bool
s 的索引将开始工作。
【讨论】:
【参考方案2】:您是否尝试过省略 == true
部分而只使用
var result = from item in items where item.IsTrue select item;
或者,使用method syntax:
var result = items.Where(item => item.IsTrue);
【讨论】:
是的,我也试过了,但它仍然在 sql 中添加了“= 1”。以上是关于针对 LINQ To SQL 查询中的位字段评估布尔值的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Linq-to-sql 错误地删除了我的联合中的字段?