2010-09-10 41 views
6

Tôi đang cố gắng thực hiện một truy vấn LINQ to SQL đơn giản đối với cơ sở dữ liệu SQL CE.đánh giá một boolean dựa vào một trường bit trong truy vấn LINQ to SQL

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

Vấn đề là các IsTrue bất động sản là một lĩnh vực bit trong cơ sở dữ liệu (bool trong CLR). Khi nó đi vào SQL trong CE tôi nhận được SELECT ... WHERE ([t0].IsTrue = 1).. Giá trị 1 là một số nguyên để SqlCe và nó sẽ không đúc nó theo mặc định.

Chỉ mục mà tôi có trên cột đó (cột IsTrue) không được sử dụng. Thay vào đó, nó cố gắng bỏ tất cả các giá trị istrue trong cơ sở dữ liệu sang số nguyên và so sánh chúng với 1.

Làm cách nào để LINQ to SQL tạo ra WHERE ([t0].IsTrue = Cast(1 as bit))...? Tôi cần bằng cách nào đó để buộc việc đúc giá trị đó vào một bit và do đó cho phép sử dụng chỉ mục?

tôi đã cố gắng:

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

Hy vọng để có được những cây biểu thức để có một dàn diễn viên trong nó để nó chuyển thành một dàn diễn viên trong LINQ To SQL, nhưng tôi không thể tìm thấy một cách. Bất kỳ ý tưởng?

+0

Tôi biết đã 6 năm sau đó, nhưng Khung thực thể đang thực hiện quá trình truyền tới bit. Ít nhất là nó là dành cho tôi. –

Trả lời

0

Các bạn đã thử bỏ đi phần == true và chỉ sử dụng

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

Ngoài ra, sử dụng method syntax:

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

+0

Có, tôi đã thử điều đó, nhưng nó vẫn thêm "= 1" vào sql. – obsid

4

tôi hạ cánh trên trang này bởi vì tôi có cùng một vấn đề.

Tôi thấy bạn có thể làm việc xung quanh sự hỏng hóc đặc biệt này bằng cách sử dụng truy vấn được biên dịch. Để sử dụng ví dụ của bạn:

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

Nếu bạn nhìn vào SQL này tạo ra (bằng cách hooking dòng log trong DataContext) nó vì một lý do làm điều đúng nơi sử dụng các truy vấn không biên soạn thì không. Chỉ mục của bạn có bool giây trong số đó sẽ bắt đầu hoạt động.

Các vấn đề liên quan