簡體   English   中英

Nhibernate自定義AliasToBean

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM