2010-04-12 28 views
5

I'am sử dụng wrapper để có được một số dữ liệu từ bảng tàiLINQ to vấn đề wrapper NHibernate sử dụng nơi tuyên bố

IQueryable<StarGuestWrapper> WhereQuery =  
session.Linq<User>().Where(u => u.HomeClub.Id == clubId && u.IsActive).Select(
        u => 
        new StarGuestWrapper() 
         { 
          FullName = u.Name + " " + u.LastName, 
          LoginTime = u.SomeDateTime, 
          MonthsAsMember = u.SomeIntergerValue, 
          StarRating = u.SomeOtherInteregValue, 
          UserPicture = u.Photo.PhotoData, 
          InstructorFullName = u.SomeInstructorName, 
          TalkInteractionDuringSession = u.SomeBoolValue, 
          GoalInteractionDuringSession = u.SomeOtherBoolValue 
         }); 

tôi sử dụng này mà không có một vấn đề như một IQueryable để tôi có thể làm những việc hữu ích trước khi thực sự chạy truy vấn . Giống như:

WhereQuery.Skip(startRowIndex).Take(maximumRows).ToList(); 

v.v.

Sự cố xảy ra khi sử dụng câu lệnh 'where' trên truy vấn. Ví dụ:

WhereQuery.Where(s => s.StarRating == 1) 

sẽ ném một ngoại lệ trong thời gian chạy đó starRating 'không tồn tại trong bảng người dùng - tất nhiên nó không đó là một tài sản giấy gói. Nó sẽ hoạt động nếu tôi thực hiện truy vấn theo số

WhereQuery.AsEnumerable().Where(s => s.StarRating == 1) 

nhưng sau đó mất tất cả cảm giác sử dụng IQueryable và tôi không muốn làm điều này.

Điều kỳ lạ và thú vị mà không phải tất cả các thuộc tính từ lỗi trình bao bọc, tất cả các giá trị bool đều có thể được sử dụng trong câu lệnh. Ví dụ:

WhereQuery.Where(s => s.TalkInteractionDuringSession) 

Nó hoạt động trong EntityFramework, tại sao tôi gặp lỗi này trong NHibernate và cách làm cho nó hoạt động theo cách tôi muốn?

+0

Bạn định truy vấn (sử dụng kho dữ liệu) như thế nào trên thứ gì đó không có trong kho dữ liệu? Cách duy nhất để tìm tất cả những người có StarRating = 1 là liệt kê tất cả mọi thứ. –

+0

@Bạn dường như không hiểu cách hoạt động của ORM, đó là truy vấn không phải là một bộ sưu tập, nó không chứa dữ liệu mà nó truy vấn cơ sở dữ liệu cho dữ liệu này. Đừng bận tâm các giá trị hardcoded trong wrapper này, nó chỉ là một exaple, tôi shold viết u.SomeValue thay thế. – Jacob

+0

Đó là * một truy vấn trước khi bạn tạo loại kết quả mới, tại thời điểm đó bạn ngắt kết nối trở lại lưu trữ dữ liệu, kết quả của câu lệnh chọn của bạn không còn là truy vấn mà bạn có thể tiếp tục thêm .Where clauses to. Điều này giống như loại mã này: SELECT * FROM (ma thuật C# mã ở đây từ (SELECT * FROM yourtable)) –

Trả lời

2

Hãy nhớ rằng nhà cung cấp LINH cũ nHibernate chỉ thực hiện một phần và không còn hoạt động tích cực nữa. Một nhà cung cấp LINQ mới và đầy đủ hơn đang được phát triển ngay bây giờ và sẽ là một phần của NH3.0 (bạn có thể kiểm tra thân cây và xây dựng nó để xem nếu nó giải quyết vấn đề này).

Đề xuất của tôi là thay đổi mã của bạn để gọi ToList() tại thời điểm bạn rõ ràng muốn nhấn vào cơ sở dữ liệu. Bạn đang chuyển một truy vấn có giá trị trong tương lai trở lại từ kho lưu trữ của bạn tại thời điểm đó bất cứ điều gì có thể xảy ra về mặt kỹ thuật cho truy vấn. Ngay cả EF và LINQ2SQL cũng không thể dịch bất kỳ truy vấn LINQ nào có thể vào SQL.

Tôi nhận ra đây không phải là những gì bạn muốn có thể làm, nhưng tôi nghĩ bạn đang cố gắng uốn cong khuôn khổ để làm điều gì đó theo cách này không hề tự nhiên chút nào.

+0

Chris, phiên bản cuối cùng của Linq dll là gì? 2.0? – NetSide

+0

Tôi sẽ không biết, bạn có lẽ sẽ phải đi hỏi trên danh sách NHUsers –

+0

Có lẽ nên đề cập đến NH3.0 chỉ cần nhấn phát hành alpha và có lẽ khá ổn định nếu bạn muốn dùng thử. –