[英]Nhibernate custom AliasToBean
我正在nhibernate中閱讀有關aliastobean的內容,這是我的項目中遇到的問題,並且我已經與這篇文章交叉了: http : //blog.andrewawhitaker.com/blog/2014/06/19/queryover-series-part-4-transforming /
我發現有趣的是自定義AliasToBean變形程序,這是它的工作方式:
public class AliasToBeanWithCallbackTransformer<T> : IResultTransformer
{
private readonly AliasToBeanResultTransformer aliasToBeanTransformer;
private readonly Action<T> callback;
public AliasToBeanWithCallbackTransformer(Action<T> callback)
{
this.aliasToBeanTransformer = new AliasToBeanResultTransformer(typeof(T));
this.callback = callback;
}
public IList TransformList(IList collection)
{
return this.aliasToBeanTransformer.TransformList(collection);
}
public object TransformTuple(object[] tuple, string[] aliases)
{
object result = this.aliasToBeanTransformer.TransformTuple(tuple, aliases);
// Call the callback before returning the result.
callback((T)result);
return result;
}
}
DTO類:
public class ProductReviewDTO
{
public int ProductReviewID { get; set; }
public int Rating { get; set; }
public string Comments { get; set; }
public DateTime DateRetrieved { get; set; }
}
以及用法:
DateTime dateRetrieved = DateTime.Now;
IList<ProductReviewDTO> highestReviews =
session.QueryOver<ProductReview>()
.SelectList(list => list
.Select(pr => pr.Comments).WithAlias(() => result.Comments)
.Select(pr => pr.Id).WithAlias(() => result.ProductReviewID)
.Select(pr => pr.Rating).WithAlias(() => result.Rating)
)
// Assign "DateRetrieved correctly:
.TransformUsing(new AliasToBeanWithCallbackTransformer<ProductReviewDTO>(
hp => hp.DateRetrieved = dateRetrieved))
.Take(10)
.List<ProductReviewDTO>();
似乎一切都很好,我了解他們在這里做了什么,但是僅使用常規Transformer在選擇列表中進行操作難道不是更簡單嗎?
像這樣:
DateTime dateRetrieved = DateTime.Now;
IList<ProductReviewDTO> highestReviews =
session.QueryOver<ProductReview>()
.SelectList(list => list
.Select(pr => pr.Comments).WithAlias(() => result.Comments)
.Select(pr => pr.Id).WithAlias(() => result.ProductReviewID)
.Select(pr => pr.Rating).WithAlias(() => result.Rating)
.Select(() => dateRetrieved).WithAlias(() => result.DateRetrieved)
)
// Assign "DateRetrieved correctly:
.TransformUsing(Transformers.AliasToBean<ProductReviewDTO>())
.Take(10)
.List<ProductReviewDTO>();
或者,也許我錯過了這個概念,對於更復雜的aliastobean情況,這可能更好,但是仍然可以只使用常規轉換器來進行別名。
那么有人知道這有什么意義嗎?
將其放在Select子句中會將其寫入sql-query,這是額外的開銷,並使日志和分析器中的查詢變得復雜。 傳輸的數據也會增加。 我懷疑這在您的示例中是否重要。 另一個更有效的解決方案是簡單的foreach,因為它避免創建匿名對象並且不調用委托。
DateTime dateRetrieved = DateTime.Now;
IList<ProductReviewDTO> highestReviews =
session.QueryOver<ProductReview>()
.SelectList(list => list
.Select(pr => pr.Comments).WithAlias(() => result.Comments)
.Select(pr => pr.Id).WithAlias(() => result.ProductReviewID)
.Select(pr => pr.Rating).WithAlias(() => result.Rating)
)
.TransformUsing(Transformers.AliasToBean<ProductReviewDTO>())
.Take(10)
.List<ProductReviewDTO>();
foreach (var review in highestReviews)
review.DateRetrieved = dateRetrieved;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.