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