В Habanero как бы я ограничил количество объектов, возвращаемых из базы данных

#c# #orm #habanero

#c# #orm #habanero

Вопрос:

Мне нужно ограничить количество клиентских bo, возвращаемых из базы данных, поскольку я ищу частичное имя клиента, и на данный момент я получаю более 600 bo при поиске ‘a’. Я хотел бы ограничить это до 20. Мой код на данный момент

     public IEnumerable<Customer> FindCustomers(string partialCustomerName)
    {
        if (string.IsNullOrEmpty(partialCustomerName)) 
          throw new ArgumentException("partialCustomerName must be at least one character long");
        var criteria = Criteria.Create<Customer, string>(cust =>   cust.CustomerName, Criteria.ComparisonOp.Like, partialCustomerName   "%");
        return Broker.GetBusinessObjectCollection<Customer>(criteria);
    }
  

Ответ №1:

Я не могу протестировать это прямо сейчас, но вы должны быть в состоянии это сделать, используя метод LoadWithLimit (). Переменная TotalRecords будет содержать общее количество найденных результатов на случай, если вы захотите включить некоторую информацию, например «Отображение 20 результатов TotalRecords»..

 public IEnumerable<Customer> FindCustomers(string partialCustomerName)
{
    if (string.IsNullOrEmpty(partialCustomerName)) 
      throw new ArgumentException("partialCustomerName must be at least one character long");

    var criteria = Criteria.Create<Customer, string>(cust =>   cust.CustomerName, Criteria.ComparisonOp.Like, partialCustomerName   "%");
    int totalRecords;
    return Broker.GetBusinessObjectCollection<Customer>().LoadWithLimit(criteria, 0, 20, ref totalRecords);
}
  

Комментарии:

1. Спасибо, это работает, но, похоже, это приводит к вызовам to к базе данных.

2. Да, это привело бы к вызову базы данных и загрузке всех клиентов методом broker, а затем перезагрузило бы коллекцию с критериями и ограничением.

Ответ №2:

Till находится на правильном пути, но не предоставил правильный синтаксис. Брокер используется для загрузки коллекций из текущего средства доступа к данным, а не для создания новых. Таким образом, код тогда был бы:

 public IEnumerable<Customer> FindCustomers(string partialCustomerName)
{
    if (string.IsNullOrEmpty(partialCustomerName)) 
      throw new ArgumentException("partialCustomerName must be at least one character long");

    var criteria = Criteria.Create<Customer, string>(cust =>   cust.CustomerName, Criteria.ComparisonOp.Like, partialCustomerName   "%");
    int totalRecords;
    var col = new BusinessObjectCollection<Customer>();
    col.LoadWithLimit(criteria, "CustomerName", 0, 20, ref totalRecords);
    return col;
}
  

Это должно сработать!
Пожалуйста, присудите ответ Тиллу, а не мне. Он провел больше всего исследований. Я только что исправил синтаксис 🙂

РЕДАКТИРОВАТЬ: После комментариев ниже об уродливом API я включу предлагаемые изменения в метод, чтобы он выглядел чище (спасибо за ваше предложение @GloryDev):

 public IEnumerable<Customer> FindCustomers(string partialCustomerName)
{
    if (string.IsNullOrEmpty(partialCustomerName)) 
      throw new ArgumentException("partialCustomerName must be at least one character long");
    var col = new BusinessObjectCollection<Customer>();
    col.LoadWithLimit("CustomerName Like "   partialCustomerName   "%", "CustomerName", 20);
    return col;
}
  

Второй параметр — это поле для упорядочивания, которое необходимо для того, чтобы выборка с ограничениями имела какой-либо смысл. Надеюсь, это поможет.

Комментарии:

1. Отлично, именно то, что я искал.

2. Да, я предпочитаю тот, который указан в моем ответе ниже. Это создает. Материал с критериями, использующий лямбды, очень новый и, насколько я понимаю, это то, что используется за кулисами в Linq для Habanero. Я не уверен, предназначено ли это для API.

3. Я согласен с @ Chris в этом. Такое использование API довольно абстрактно и совсем не выглядит чистым. Материал lambda действительно предназначен для синтаксического анализа полных лямбда-выражений, а не просто для получения имени свойства. Я добавил более чистую версию вышеупомянутого метода в конце моего поста, который включает в себя предложение @GloryDev с небольшой модификацией.

4. и @GloryDev, честно говоря, с частью критериев все в порядке, это не очень хорошо (со странным способом определения операции), ужасен основной API new BusinessObjectCollection<Customer>(); , col.LoadWithLimit это чистые WTFS, видя приведенный ниже фабричный метод, это еще больший WTF Broker.GetBusinessObjectCollection<Customer>().LoadWithLimit( Практически каждый раз, когда API требует, чтобы вы использовали созданный ими класс коллекции, это показывает ошибку архитектора с их стороны. Но с ORM это одна из серых областей, поскольку они могли бы отказаться от необходимости использовать динамические прокси, возможно

Ответ №3:

Эндрю, Ты всегда мог бы это сделать, это выглядит немного аккуратнее, но требует синтаксического анализа имени пользователя.

         var totalRecords = 0;
        Broker.GetBusinessObjectCollection<Customer>("CustomerName Like partialCustomerName ", "CustomerName", 0, 20, out totalRecords);
  

Комментарии:

1. Ах, потрясающе, я вижу, что этот синтаксис также поддерживается брокером. Я предпочитаю этот синтаксис моему решению выше 🙂