В Habanero, как бы я ограничил количество объектов, возвращаемых из базы данных - PullRequest
1 голос
/ 02 июня 2011

Мне нужно ограничить количество покупок бо, возвращаемых из базы данных, так как я ищу частичное имя покупателя, и в настоящее время я получаю более 600 бо, когда я ищу «а».Я хотел бы ограничить это до 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);
    }

Ответы [ 3 ]

2 голосов
/ 02 июня 2011

Я не могу проверить это прямо сейчас, но у вас должно получиться это с помощью метода 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 голос
/ 02 июня 2011

Andrew Вы всегда можете сделать это выглядит немного аккуратнее, но включает в себя разбор CustomerName.

        var totalRecords = 0;
        Broker.GetBusinessObjectCollection<Customer>("CustomerName Like partialCustomerName ", "CustomerName", 0, 20, out totalRecords);
1 голос
/ 02 июня 2011

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

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;
}

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

...