2016-06-30 4 views
3

Я заметил огромную разницу в том, как работает NPoco (или PetaPoco) в зависимости от того, какую функцию вы вызываете при использовании LINQ.Нормально ли для NPoco/PetaPoco Fetch() получить все данные, а затем фильтровать клиентскую сторону?

Например сравните Fetch(), который Query(), которые оба появляются сделать то же самое:

: Fetch<EntryImage>().Where(t => t.EntryType == type && t.EntryID == entryID);

B: Query<EntryImage>().Where(t => t.EntryType == type && t.EntryID == entryID);

А возвращается каждый строка в таблице (10 000+), а затем фильтрует клиентскую сторону.

B возвращает только один ряд, которого я ожидаю.

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

ответ

4

Это ожидаемое поведение для NPoco.

Согласно источнику:

Fetch возвращает список.

/// <summary> 
    /// Fetch all objects of type T from the database using the conventions or configuration on the type T. 
    /// Caution: This will retrieve ALL objects in the table 
    /// </summary> 
    List<T> Fetch<T>(); 

Query возвращает IQueryProviderWithIncludes (аналогичные IQueryable)

/// <summary> 
    /// Entry point for LINQ queries 
    /// </summary> 
    IQueryProviderWithIncludes<T> Query<T>(); 
+0

Это настолько опасно. Я хотел бы, чтобы был вариант конфигурации NPoco для исключения исключения, если вы вызываете любой из этих методов, чтобы избежать случайного использования их. – NickG

+0

@NickG Вы можете написать анализатор Roslyn для просмотра «Fetch» ​​в вашей кодовой базе и установить уровень предупреждения на «Ошибка», чтобы он не скомпилировался. –

+0

Отличный ответ для NPoco - мне тоже нравятся ссылки на исходный код! – mjwills

0

Если вы используете PetaPoco (*), ни один из исходных образцов кода велики - но вопрос не Fetch против запроса.

В обоих случаях SQL, отправляемый на сервер, в основном «SELECT * FROM EntryImage» (запустите трассировку sql и подтвердите это, если вы не уверены).

Fetch vs Query не изменяет отправку SQL на сервер - это просто изменяет способ доставки этих данных на стороне клиента (т. Е. В виде списка или отложенного выполнения IEnumerable через выход).

Чтобы сделать то, что вы хотите, проверить PetaPoco's documentation:

var sql=PetaPoco.Sql.Builder() 
      .Select("*") 
      .From("articles") 
      .Where("date_created < @0", DateTime.UtcNow) // fluent Where clause 
      .OrderBy("date_created DESC"); 

(*)Если вы используете NPoco см above для ответа.

+0

ОК - похоже, PetaPoco ведет себя совершенно по-другому в NPoco (см. Ответ Альберта). Я не должен был ссылаться на оба вопроса :( – NickG