C# Nhibernate自定义别名为

C# Nhibernate自定义别名为,c#,.net,nhibernate,queryover,C#,.net,Nhibernate,Queryover,在我的项目中,我正在阅读关于nhibernate中aliastobean的文章,我已经越过了这篇文章: 我发现有趣的是自定义别名ToBean trasformer, 以下是它的工作原理: public class AliasToBeanWithCallbackTransformer<T> : IResultTransformer { private readonly AliasToBeanResultTransformer aliasToBeanTransformer;

在我的项目中,我正在阅读关于nhibernate中aliastobean的文章,我已经越过了这篇文章:

我发现有趣的是自定义别名ToBean trasformer, 以下是它的工作原理:

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;
    }
}
以及用法:

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>();
DateTime dateRetrieved=DateTime.Now;
IList highestReviews=
session.QueryOver()
.SelectList(list=>list
.Select(pr=>pr.Comments).WithAlias(()=>result.Comments)
.Select(pr=>pr.Id).WithAlias(()=>result.ProductReviewID)
.Select(pr=>pr.Rating).with别名(()=>result.Rating)
)
//正确地分配“日期检索”:
.Transform使用(新别名ToBean with Callback Transformer(
hp=>hp.DateRetrieved=DateRetrieved))
.Take(10)
.List();
这看起来很好,我理解他们在这里做了什么,但是在选择列表中使用一个常规的转换器不是更简单吗

像这样:

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>();
DateTime dateRetrieved=DateTime.Now;
IList highestReviews=
session.QueryOver()
.SelectList(list=>list
.Select(pr=>pr.Comments).WithAlias(()=>result.Comments)
.Select(pr=>pr.Id).WithAlias(()=>result.ProductReviewID)
.Select(pr=>pr.Rating).with别名(()=>result.Rating)
。选择(()=>dateRetrieved)。使用别名(()=>result.dateRetrieved)
)
//正确地分配“日期检索”:
.TransformUsing(Transformers.AliasToBean())
.Take(10)
.List();
或者,我可能忽略了这个概念,也许这对于更复杂的aliastobean情况更好,但是,您仍然可以使用常规的转换器来实现alias


因此,任何人都知道这有什么意义吗?

在Select子句中包含它会将其写入sql查询,这是额外的开销,并且会使日志和分析器中的查询复杂化。传输的数据也将增加。我怀疑这在你的例子中是否重要。另一个更有效的解决方案是简单的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;
DateTime dateRetrieved=DateTime.Now;
IList highestReviews=
session.QueryOver()
.SelectList(list=>list
.Select(pr=>pr.Comments).WithAlias(()=>result.Comments)
.Select(pr=>pr.Id).WithAlias(()=>result.ProductReviewID)
.Select(pr=>pr.Rating).with别名(()=>result.Rating)
)
.TransformUsing(Transformers.AliasToBean())
.Take(10)
.List();
foreach(highestReviews中的var审查)
review.DateRetrieved=DateRetrieved;

也许你应该直接向博客作者提问,在博客上发表评论,如果他想在这里回答,最后把他指到这里。
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;