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