#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, видя приведенный ниже фабричный метод, это еще больший WTFBroker.GetBusinessObjectCollection<Customer>().LoadWithLimit(
Практически каждый раз, когда API требует, чтобы вы использовали созданный ими класс коллекции, это показывает ошибку архитектора с их стороны. Но с ORM это одна из серых областей, поскольку они могли бы отказаться от необходимости использовать динамические прокси, возможно
Ответ №3:
Эндрю, Ты всегда мог бы это сделать, это выглядит немного аккуратнее, но требует синтаксического анализа имени пользователя.
var totalRecords = 0;
Broker.GetBusinessObjectCollection<Customer>("CustomerName Like partialCustomerName ", "CustomerName", 0, 20, out totalRecords);
Комментарии:
1. Ах, потрясающе, я вижу, что этот синтаксис также поддерживается брокером. Я предпочитаю этот синтаксис моему решению выше
![]()