NHibernate,匿名类型列表

时间:2014-02-06 20:38:20

标签: asp.net-mvc nhibernate nhibernate-mapping

我创建了Widget系统,其中小部件可以放置在任何页面上的任何区域(Region)中。 Widget是继承自ClassMapping的模型。 它工作得很好,但在NHibernate中有更简单的方法来完成这个功能吗?我不是NHibernate的专家,所以欢迎任何建议。

问题:我正在考虑session.CreateCriteria(t)中的匿名“t”,它在运行时加载基类Widget,而不是例如继承Widget的Content类,所以我不能使用更早的代码,请参阅第一个代码块。示例:我无法达到例如Region.Sidebar,它总是为每个小部件返回0。这就是为什么我需要在使用它之前将小部件转换为“动态”。请参阅代码中的注释。

注意:TypeResolver返回Widget名称列表。

注意:Region是一个枚举,例如Region.Header。

    //Previous method
    public static List<IWidget> GetWidgets(string zone, int id)
    {
        return (from t in new TypeResolver().GetAllWidgets()
                select ActiveRecordMediator.FindAll(t) //<!-- Loading all Widgets fine.
                    into widgets
                    where widgets.Length > 0
                    from item in ((IWidget[])widgets)
                    select item
                        into a
                        where a.Zone.Equals(zone) && a.PageId.Equals(id) && a.Active
                        orderby a.SortOrder
                        select a).ToList();
    }  

//Current method 
public static partial class HtmlHelperExtensions
{
    public static IHtmlString Zone(this HtmlHelper html, Region region)
    { 
        var sb = new StringBuilder();
        var session = SessionManager.Instance.GetSession();
        var widgetlist = new TypeResolver().GetAllWidgets();

        var list = (from t in widgetlist
        //This line loads base class   --> 
                    select session.CreateCriteria(t).List().As<System.Collections.ArrayList>() 
                    into widgets 
                    where widgets.Count > 0 
                    from item in widgets.ToArray() 
                    select item
                        into a 
                        select a).ToList();

        foreach (var item in list) 
        {
            dynamic widget = item;
            if (widget.Region == region && widget.Active && widget.PageId == PageExtensions.CurrentPage.Id)
                sb.Append(ViewHelper.Render<Widget>(html, widget.Template, widget));
        }
        return (sb.ToString().Length > 0) ? new HtmlString(sb.ToString()) : new HtmlString(string.Empty.Space());
    }
}

0 个答案:

没有答案