Альтернатива для использования метода в запросе к базе данных в C # с использованием платформы лица - PullRequest
0 голосов
/ 11 июля 2011

Я разделил свое приложение на DAL, BL, UI.

Я использовал репозитории с первым кодом броска структуры сущностей для доступа к базе данных SQL.я работаю над методом, чтобы получить всех людей, которые оставляют около адреса

 public GetPersonsNear(string Address){
 ...
 }
 private bool AddressesAreClose(string address1, string address2)
 {
 ...
 } 

дело в том, что linq не позволяет мне использовать мой метод (в запросе, переданном в методе "Query"репозитория)

 ...
 PersonRepository personRepository = new PersonRepository();
 var person = repository.Query(p => AddressAreClose(adress,p.Adress); 
 ...

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

  ...
 PersonRepository personRepository = new PersonRepository();
 var persons = personRepository.GetAll;
 foreach(person in persons)
 {
    if(AdressAreClose(adress,person.adress))
    ...
  }

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

разве нет более умного способа сделать это ???Я открыт для всего

1 Ответ

1 голос
/ 11 июля 2011

Ну, во-первых, вы должны использовать дженерики в своем хранилище, даже если оно ограничено Person. Таким образом, вы можете создавать каналы / фильтры из ваших запросов, чтобы очистить ваши запросы LINQ и упростить повторное использование.

Конечно, не видя полной подписи / реализации вашего Query метода, трудно сказать. Но в любом случае вам нужно вернуть IEnumerable<Person> или IQueryable<Person>, чтобы сделать следующую работу.

Таким образом, вы можете превратить AddressesAreClose в трубу / фильтр, например:

public static bool WhereAddressesAreClose(this IQueryable<Person> source, string address)
{
   return source.Where(/* your conditions */);
}

Затем вы можете использовать его в своем запросе LINQ:

var person = repository
   .Query() // Should be IQueryable<Person>
   .WhereAddressAreClose(adress);
   .ToList();

В зависимости от размера ваших данных и от того, реализуете ли вы кэширование, вам следует ограничить результаты на сервере (базе данных), а не после запроса с циклом foreach.

Если производительность невелика, рассмотрите возможность добавления индексов, использования скомпилированных запросов или перехода к хранимой процедуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...