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.
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