2012-02-10 38 views
6

Tôi có một nhu cầu rất cơ bản để lấy một số dữ liệu từ cơ sở dữ liệu và trả về một DTO. Tôi thấy rằng tham gia nhiều bảng bằng cách sử dụng nHibernate và "chiếu" để nói, để một DTO được khá một chút mã. Sau khi xem xét một số ví dụ, hầu hết không làm việc cho tôi một DTO với giá trị null, tôi cam kết với những điều sau đây và đã tự hỏi nếu bạn nHibernate ninja ra có thể cho tôi biết nếu có một cách tốt hơn.nHibernate tham gia nhiều bảng và sử dụng AliasToBean Transformer

public IOpenIdUser GetOpenIdUser(string claimedIdentifier, IOpenIdUser openIdUserDto) 
    { 
     User user = null; 
     OpenIdUser openIdUser = null; 
     Profile profile = null; 
     UserType userType = null; 


     return 
      SessionWrapper.Session.QueryOver(() => user).JoinAlias(() => user.Profiles,() => profile). 
       JoinAlias(() => user.OpenIdUsers,() => openIdUser).JoinAlias(() => user.UserType,() => userType) 
       .Where(() => user.UserName == claimedIdentifier) 
       .SelectList(l => l 
            .Select(x => openIdUser.OpenIdUserId).WithAlias(() => openIdUser.OpenIdUserId) 
            .Select(x => user.UserId).WithAlias(() => openIdUserDto.UserId) 
            .Select(x => openIdUser.OpenIdClaimedIdentifier).WithAlias(
             () => openIdUserDto.ClaimedIdentifier) 
            .Select(x => openIdUser.OpenIdFriendlyIdentifier).WithAlias(
             () => openIdUserDto.FriendlyIdentifier) 
            .Select(x => openIdUser.OpenIdEndPoint).WithAlias(
             () => openIdUserDto.OpenIdEndPoint) 
            .Select(x => user.UserName).WithAlias(() => openIdUserDto.UserName) 
            .Select(x => userType.Type).WithAlias(() => openIdUserDto.UserType) 
            .Select(x => profile.DisplayName).WithAlias(() => openIdUserDto.DisplayName) 
            .Select(x => profile.EmailAddress).WithAlias(() => openIdUserDto.EmailAddress) 
            .Select(x => openIdUser.DateCreated).WithAlias(() => openIdUserDto.DateCreated) 
            .Select(x => openIdUser.LastUpdated).WithAlias(() => openIdUserDto.LastUpdated) 
            .Select(x => openIdUser.UsageCount).WithAlias(() => openIdUserDto.UsageCount) 
       ).TransformUsing(Transformers.AliasToBean<OpenIdUserDto>()).Future<OpenIdUserDto>().Single(); 
    } 

Phương thức này nằm trong UserRepository của tôi và được gọi bởi UserService của tôi. Xin vui lòng không phải là điều này thực sự hoạt động, tôi chỉ nghĩ rằng nó là quá mức cần thiết cho một nhiệm vụ đơn giản như vậy. Ngoài ra xin lưu ý rằng tôi mới đến điều này vì vậy nếu mã này là crappy tôi xin lỗi trước.

+0

Tôi cho rằng điều này phù hợp với người khác. Tôi có phiếu bầu .. W00t! – CrazyCoderz

Trả lời

2

Nếu bạn sử dụng Truy vấn thì đây là cách duy nhất.

Nếu bạn thực sự nghĩ rằng ít dòng mã được ưa chuộng hơn, trực quan hơn, hoặc ngồi tốt hơn với bạn thì bạn có thể làm một trong hai: -

  1. Tạo một cái nhìn DB và tạo mapings file cho quan điểm với mutable="false" trong định nghĩa lớp học của bạn và sử dụng protected set; trên thuộc tính lớp học của bạn
  2. Sử dụng nhà cung cấp LINQ thay vào đó, ví dụ: .Query (xem này blog post để biết thêm thông tin)
+0

Nhà cung cấp LINQ là rất tốt cho các nhiệm vụ rất cơ bản, tuy nhiên tôi không thực sự ấn tượng với SQL được tạo ra bởi nhà cung cấp LINQ. – CrazyCoderz

+0

Chấp nhận điều này là câu trả lời cho rằng bạn không chỉ ra bất kỳ vấn đề khủng khiếp nào với mã tôi đã đăng và thực sự cung cấp một cách khác để hoàn thành cùng một điều. Cảm ơn ... – CrazyCoderz

+0

Tôi sẽ không quá quan tâm đến SQL mà nhà cung cấp LINQ tạo ra cho đến khi bạn thấy rằng đó là vấn đề và 'NHPRof' sẽ thực sự cho bạn biết nếu bạn gặp sự cố. – Rippo

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