2012-06-18 30 views
6

Có ai biết cách nào để vượt qua NotSupportedException không? Tôi có một phương pháp chống lại một tài:NHibernate Vượt qua NotSupportedException

public virtual bool IsAbove(User otherUser) 
{ 
    return HeirarchyString.StartsWith(otherUser.HeirarchyString); 
} 

Và tôi muốn làm:

_session.Query<User>.Where(x => loggedInUser.IsAbove(x)); 

Nhưng điều này ném một NotSupportedException. Nỗi đau thực sự là sử dụng

_session.Query<User>.Where(x => loggedInUser.HeirarchyString.StartsWith(x.HeirarchyString)); 

hoạt động hoàn toàn tốt. Tuy nhiên, tôi không thích giải pháp này vì có nghĩa là nếu tôi thay đổi phương thức IsAbove, tôi phải nhớ tất cả những nơi tôi đã sao chép mã bất cứ khi nào tôi muốn cập nhật mã này

+1

btw, "h ** IE ** rarchy" :) – AakashM

+0

ah crap, tôi luôn là người đầu tiên chỉ ra khi mọi người không thể đánh vần quá! chắc chắn đã nhận được một sai lầm trong nhiều năm: $ –

Trả lời

3

Đặt tên biểu thức đặc điểm kỹ thuật và sử dụng lại điều đó, ví dụ:

public Expression<Func<....>> IsAboveSpecification = (...) => ...; 

public virtual bool IsAbove(User otherUser) 
{ 
    return IsAboveSpecification(HeirarchyString, otherUser.HeirarchyString); 
} 

Sử dụng lại IsAboveChỉ định trong truy vấn nếu cần. Nếu phương thức IsAbove() được sử dụng thường xuyên có thể cache kết quả của phương thức Compile() trên biểu thức.

+0

Tôi đang gặp vấn đề tương tự như OP. Không thể có được giải pháp này để làm việc. Ở nơi đầu tiên, tôi muốn có thể gọi trên đối tượng, vì vậy tôi đã phải di chuyển khởi tạo vào constructor vì 'this' không có sẵn trong initializer thành viên. Tệ hơn nữa, tôi gặp lỗi khi cố gắng gọi biểu thức đặc tả: "Phương thức, đại biểu hoặc sự kiện được mong đợi". Bất kỳ đề xuất? –

+0

Đã gọi thử .Compile(). Invoke() trên biểu thức. Nó biên dịch ngay bây giờ, nhưng nhận được cùng một ngoại lệ khi gọi hàm "IsAbove" từ một truy vấn. –

+0

Không thể gọi biểu thức từ truy vấn vì nhiều lý do: đầu tiên, khi nó được đánh dấu là công khai, NH phàn nàn rằng các trường phải được bảo vệ hoặc riêng tư. Thứ hai, khi tôi thử gọi nó từ một truy vấn bên ngoài, tôi nhận được lỗi trình biên dịch "Phương thức, đại biểu hoặc sự kiện được mong đợi" như trên. –

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