2010-08-24 39 views
5

Tôi có vấn đề này: Khi tôi cố gắng thực hiện tìm kiếm phức tạp Ayende đã tìm thấy tại địa chỉ: http://ayende.com/Blog/archive/2006/12/07/ComplexSearchingQueryingWithNHibernate.aspx với đồ thị đối tượng: Person: M: 1 Địa chỉ: M: 1 Đường: M: 1 Địa điểm: M: 1 Quốc gia Tôi nhận được lỗi sau: NHibernate.QueryException: Không thể sử dụng truy vấn con trên tiêu chí không có phép chiếu. Tôi đang làm điều này:truy vấn phức tạp với NHibernate

public List<Person> Find() 
{ 
    DetachedCriteria query = DetachedCriteria.For<Person>(); 
    AddAddressQuery(query); 
    return personRepository.Find(query); 
} 

private void AddAddressQuery(DetachedCriteria query) 
{ 
    DetachedCriteria addressQuery = null; 
    if (!String.IsNullOrEmpty(SearchParams.HouseNumer)) 
    { 
     addresaQuery = DetachedCriteria.For<Address>(); 
     addresaQuery.Add(Restrictions.Eq("HouseNumer", 
SearchParams.HouseNumer)); 
    } 
    this.AddStreetQuery(ref addressQuery); 
    if (addressQuery != null) 
    { 
     query.CreateCriteria("Address1", 
"address1").Add(Subqueries.Exists(addressQuery)); 
    } 
} 

private void AddStreetQuery(ref DetachedCriteria query) 
{ 
    DetachedCriteria streetQuery = null; 
    if (this.SearchParams.StreetId.HasValue) 
    { 
     streetQuery = DetachedCriteria.For<Street>(); 
     streetQuery .Add(Restrictions.Eq("Id", 
this.SearchParams.StreetId.Value)); 
    } 
    if (streetQuery != null) 
    { 
     query = query ?? Query.CreateCriteria("Address1"); 
     query.CreateCriteria("Street", 
"street").Add(Subqueries.Exists(streetQuery)); 
    } 
} 

Tôi làm gì sai? Vui lòng giúp

Trả lời

9

Cũng giống như thông báo lỗi - bạn cần đặt một phép chiếu cho bất kỳ truy vấn phụ nào.

Địa chỉ biến của bạnQuery, một tiêu chí tách rời, được sử dụng làm truy vấn con, nhưng nó không có phép chiếu. Phần có liên quan của truy vấn, khi được chuyển đổi sang SQL, sẽ trông giống như sau:

... EXISTS(SELECT FROM Address WHERE HouseNumber = @HouseNumber) 

... SQL không hợp lệ vì không có cột (dự định a.k.a) được chỉ định trong mệnh đề chọn.

Sử dụng SetProjection để chỉ định các cột.

+0

Có cách nào tôi có thể thấy sql được tạo từ tiêu chí mà không thực thi tiêu chí không? – Luka

+0

@Luka haha, tôi đã hỏi câu hỏi đó ngay hôm nay :) http://stackoverflow.com/questions/3562839/nhibernate-retrieve-sql-to-be-executed-as-a-string Tôi không nghĩ vậy . – cbp

+0

lol, tôi biết nó có thể với interceptors nhưng tôi không muốn thực hiện các tiêu chí. – Luka

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