2010-04-08 33 views
13

Tôi có một thực thể và lập bản đồ của nó:Hỗ trợ NHibernate LINQ ToLower() trong mệnh đề Where()?

public class Test 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
} 

public class TestMap : EntityMap<Test> 
{ 
    public TestMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Map(x => x.Description); 
    } 
} 

Tôi đang cố gắng để chạy một truy vấn trên đó (để lấy nó ra khỏi cơ sở dữ liệu):

var keyword = "test" // this is coming in from the user 
keyword = keyword.ToLower(); // convert it to all lower-case 

var results = session.Linq<Test> 
    .Where(x => x.Name.ToLower().Contains(keyword)); 

results.Count(); // execute the query 

Tuy nhiên, bất cứ khi nào tôi chạy này truy vấn, tôi nhận được ngoại lệ sau đây:

Index was out of range. Must be non-negative and less than the size of the 
collection. Parameter name: index 

Am tôi ngay khi tôi nói rằng, hiện nay, LINQ to NHibernate không hỗ trợ ToLower()? Và nếu như vậy, là có một thay thế cho phép tôi để tìm kiếm một chuỗi ở giữa một chuỗi mà LINQ NHibernate là tương thích với? Ví dụ: nếu người dùng tìm kiếm kap, tôi cần nó để khớp với Kapiolani, MakapuuLapkap.

+0

Tại sao bạn nghĩ rằng vấn đề là trong các cuộc gọi đến ToLower() - nó là một phương pháp tiêu chuẩn được xác định trên lớp String và nên không có gì để làm với NHibernate LINQ. Tại dòng nào trong nguồn ở trên bạn có ngoại lệ không? – Slavo

+1

Trên 'results.Count()', vì đó là khi nó được đánh giá. Và nó có một LOT để làm với LINQ NHibernate, vì nó cần phải chuyển đổi nó sang SQL. –

+0

Nhà cung cấp Linq đó khá cũ và chưa được cập nhật trong một thời gian. Nó có thể làm việc, nhưng bạn cũng có thể muốn thử các nhà cung cấp Linq mới hơn trong thân cây NHibernate. –

Trả lời

10

Tôi đã thực hiện điều này gần đây. Tôi có thể nói với bạn rằng ToLower() không hoạt động và Contains() và StartsWith() làm việc và không phân biệt chữ hoa chữ thường. Bạn có thể nhận được ảnh hưởng mong muốn bằng cách sử dụng Contains() và StartsWith() trực tiếp.

+0

Doh, tôi không thể tin rằng tôi đã không nhận thấy rằng 'Contains()' và 'StartsWith()' là phân biệt chữ hoa chữ thường. Tôi lãng phí 5 giờ ngày hôm qua cố gắng để có được 'ToLower()' để làm việc khi nó đã được thực hiện! –

1

Theo comments trong hai blog posts chức năng này là not implemented yet.

+0

Đó NHUsers Google Groups thread thực sự ngụ ý rằng nó hoạt động. –

+0

@Michael, tôi không tìm thấy bất kỳ bằng chứng nào trong chuỗi này cho thấy rằng nó hoạt động. –

0

Bạn có thể muốn xác nhận xem cơ sở dữ liệu có sử dụng độ nhạy trường hợp hay không.

Nếu không, bạn không cần .ToLower()

10

Dường như có rất nhiều sự nhầm lẫn xung quanh chủ đề này.

  • Nhà cung cấp Linq "cũ" (dành cho NHibernate 2.x) có thể không hỗ trợ điều này. Nếu đó là trường hợp, nó sẽ không bao giờ bởi vì nó không được duy trì nữa.
  • Các nhà cung cấp mới (bao gồm với NHibernate 3.x) không hỗ trợ nó (mặc dù ToUpper và ToLower dường như được đảo ngược, xem http://groups.google.com/group/nhibernate-development/browse_thread/thread/a167216e466b3241)
  • ContainsStartsWith bản đồ để các nhà điều hành LIKE trong SQL. Họ là không phải là không phân biệt chữ hoa chữ thường; đó là sự đối chiếu khiến chúng phân biệt chữ hoa chữ thường, do đó phụ thuộc vào cách cột/lược đồ của bạn được tạo ra như thế nào.

Cập nhật (2010/04/09): lỗi xác nhận và vá nộp, xem https://nhibernate.jira.com/browse/NH-2169

Cập nhật (2010/05/21): bản vá đã được áp dụng vào 2010-05-01 và làm việc như mong đợi .

+0

vì vậy, phiên bản nào có bản sửa lỗi? –

+0

@LouisRhys chỉ nhận được sự ổn định mới nhất. –

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