Только получите определенные столбцы при использовании запросов Critera?

В течение многих лет я создавал систему для отеля с веб-сайтом, и у меня была похожая ситуация, может быть, вы что-то получаете, разница в том, что, как у вас есть цены на номера в файле JSON, я помещаю их в таблицу наконец, появилось больше столов, и цена за номер была рассчитана с учетом факторов времени года, количества дней вперед, типа номера и наличия промежуточных праздников. где у меня есть var Q , вы можете поместить свой JSON-запрос. Это код:

 public DataTable DoGrid()
    {
        DateTimeFormatInfo dtfi = CultureInfo.GetCultureInfo("en-US").DateTimeFormat;
        DataTable dt = new DataTable();
        DataRow row;
        dt.Columns.Add("No", typeof(int));
        dt.Columns.Add("Year", typeof(string));
        dt.Columns.Add("Month", typeof(string));
        dt.Columns.Add("Date", typeof(string));
        dt.Columns.Add("Occupation", typeof(string));
        for(day = CalFrom.Date; day <= CalTo; day = day.AddDays(1))
        {
            var Q = db.Reservas.Where(c => c.CheckIn <= day && c.CheckOut > day && c.Cancelado == false);
            string MyMonth = dtfi.GetMonthName(day.Month).ToString();
            row = dt.NewRow();
            row["No"] = dt.Rows.Count + 1;
            row["Year"] = day.Year.ToString();
            row["Month"] = MyMonth;
            row["Date"] = day.ToString("dd/MM/yyyy");
            row["Occupation"] = Q.Count();
            dt.Rows.Add(row);
        }
        return dt;
    }

    public DateTime day { get; set; }

    public DateTime CalFrom
    {
        get
        {
            return DpFrom.Value.Value;
        }
    }

    public DateTime CalTo
    {
        get
        {
            return DpTo.Value.Value;
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        GridView1.DataSource = DoGrid();
        GridView1.DataBind();
    }
}

И это результат кода Data Table Example [ 111]

19
задан BartoszKP 20 February 2016 в 19:07
поделиться

4 ответа

Да можно сделать это с запросами критериев при помощи проекций. Просто проект только свойства, которые Вы хотите использовать и только они будут включены в избранный пункт скомпилированного запроса.

http://nhibernate.info/doc/nh/en/index.html#querycriteria-projection

Обновление редактирования

Существует несколько способов выполнить это с некоторыми ограничениями как бы то ни было. 1) путь NHibernate.

var list = session.CreateCriteria(typeof (Task))
.SetProjection(Projections.ProjectionList()
                   .Add(Projections.Property("Name"), "Name")
                   .Add(Projections.Property("ID"), "ID")
)
.SetResultTransformer(Transformers.AliasToBean(typeof (Task)))
.List();

Просто назначьте имя свойства псевдонимом к Вашей проекции, и преобразователь AliasToBean отобразит те проекции на фактический класс. Ограничение к этому методу - то, что любые свойства, которые Вы отображаете, должны иметь метод set в ПОСТЕПЕННО класс, это может быть защищенным методом set, но он должен иметь метод set.

Можно также сделать это с linq также в немного отличающийся вид

var list = session.CreateCriteria(typeof (Task))
.SetProjection(Projections.ProjectionList()
                   .Add(Projections.Property("Name"))
                   .Add(Projections.Property("ID"))
)
.List<IList>()
.Select(l => new Task() {Name = (string) l[0], ID = (Guid) l[1]});

Это просто использует linq для отображения индексируемого списка, который является ouput в новый экземпляр класса Задачи. То же ограничение как выше применяется за исключением того, что это немного более серьезно в этом, все отображенные свойства должны иметь общедоступный метод set, потому что, именно это использование linq сделать заполняют объект.

Я надеюсь, что это помогает Вам.

34
ответ дан 30 November 2019 в 03:29
поделиться

В ответ на Ваше редактирование: Насколько я знаю, это не возможно.

Но, то, что можно сделать, создают класс, который известен NHibernate, и это просто содержит свойства, которыми Вы интересуетесь.

Например, класс 'TaskView', который просто содержит определенные свойства класса 'Задачи'.
Необходимо будет 'импортировать' класс TaskView в файле hbm.xml, так, чтобы NHibernate знал об этом классе (см., что импорт отображается).
Затем можно использовать Проекцию для преобразования 'Задачи' в экземпляр TaskView. Когда Вы взглянули на запрос, который генерирует NHibernate, Вы будете видеть, что он только получит столбцы, необходимые для заполнения класса TaskView.

Что-то как я отправил здесь также: NHibernate и количества Набора

5
ответ дан 30 November 2019 в 03:29
поделиться

Я не уверен, удовлетворит ли это Вашим целям, но это - только предложение: если запрос заканчивается, чтобы быть чем-то, что Вы всегда используете так или иначе, можно создать представление SQL для него, то создать отображающийся файл против Представления.

NHibernate будет рассматривать Представление точно так же, как это было бы любая таблица, хотя, конечно, операции CRUD будут проблемой в отношении проблем целостности данных.

0
ответ дан 30 November 2019 в 03:29
поделиться

Вы пробовали установить в конструкторе по умолчанию значения по умолчанию? Поскольку это проблема со стороны приложения, ее решать вам. Кстати, зачем нужен конструктор для каждой перестановки? Hibernate будет использовать либо конструктор всех аргументов, либо конструктор без аргументов, а затем использовать сеттеры, поэтому нет необходимости выполнять всю эту работу. На самом деле он может делать больше, если я правильно помню, он может даже устанавливать все частные поля без сеттеров, если он настроен правильно, с помощью магии манипуляции с байтовым кодом.

0
ответ дан 30 November 2019 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: