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
, Makapuu
và Lapkap
.
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
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. –
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. –