Как проверить на присутствие OrderBy в дереве выражений ObjectQuery <T>

Вы пытаетесь смоделировать модуль Players, а не класс Players. Попробуйте это:

@patch.object(myproject.entities.Players.Players, 'add_player', fake_add_player)

Некоторые несвязанные, незапрошенные советы:

  • , очевидно, у вас есть файл с именем Players.py, содержащий класс Player. Я ожидаю, что этот класс будет жить в модуле entities (myproject/entities.py вместо myproject/entities/Players.py).
  • ваш fake_add_players сломан. Должно быть:

    def fake_add_player(self, player):
        self.players.append(player)
    

    После патча Игроки, self относится к Players, а не PlayersTest. Вы можете удалить функцию из класса, чтобы избежать этой путаницы.

  • Я не совсем уверен, чего вы пытаетесь достичь, но у меня есть догадка, что ваш класс Players также может быть пользовательским менеджером .

6
задан Peter 28 July 2015 в 13:13
поделиться

5 ответов

Можно обратиться к этому в типе возврата ProvideDefaultSorting. Этот код не создает:

    public IOrderedQueryable<int> GetOrderedQueryable()
    {
        IQueryable<int> myInts = new List<int>() { 3, 4, 1, 2 }.AsQueryable<int>();
        return myInts.Where(i => i == 2);
    }

Этот код сборки, но коварно и кодер, получает то, чего они заслуживают.

    public IOrderedQueryable<int> GetOrderedQueryable()
    {
        IQueryable<int> myInts = new List<int>() { 3, 4, 1, 2 }.AsQueryable<int>();
        return myInts.Where(i => i == 2) as IOrderedQueryable<int>;
    }

Та же история с касательно (это не создает):

    public void GetOrderedQueryable(ref IOrderedQueryable<int> query)
    {
        query = query.Where(i => i == 2);
    }
1
ответ дан 17 December 2019 в 04:53
поделиться

Подкачка страниц зависит от Упорядочивания сильным способом. Почему бы не сильно связывать операции? Вот один способ сделать это:

Объекты поддержки

public interface IOrderByExpression<T>
{
  ApplyOrdering(ref IQueryable<T> query);
}

public class OrderByExpression<T, U> : IOrderByExpression<T>
{
  public IQueryable<T> ApplyOrderBy(ref IQueryable<T> query)
  {
    query = query.OrderBy(exp);
  }
  //TODO OrderByDescending, ThenBy, ThenByDescending methods.

  private Expression<Func<T, U>> exp = null;

  //TODO bool descending?
  public OrderByExpression (Expression<Func<T, U>> myExpression)
  {
    exp = myExpression;
  }
}

Рассматриваемый метод:

public IQueryable<Category> List(int startIndex, int count, IOrderByExpression<Category> ordering)
{
    NorthwindEntities ent = new NorthwindEntities();
    IQueryable<Category> query = ent.Categories;
    if (ordering == null)
    {
      ordering = new OrderByExpression<Category, int>(c => c.CategoryID)
    }
    ordering.ApplyOrdering(ref query);

    return query.Skip(startIndex).Take(count);
}

Некоторое время спустя, вызов метода:

var query = List(20, 20, new OrderByExpression<Category, string>(c => c.CategoryName));
2
ответ дан 17 December 2019 в 04:53
поделиться

Благодаря David B у меня есть следующее решение. (Я должен был добавить обнаружение для ситуации, где частичный метод не выполнялся или просто возвратился, это - параметр).

public partial class Repository
{
    partial void ProvideDefaultSorting(ref IOrderedQueryable<Category> currentQuery);

    public IQueryable<Category> List(int startIndex, int count)
    {
        NorthwindEntities ent = new NorthwindEntities();
        IOrderedQueryable<Category> query = ent.CategorySet;
        var oldQuery = query;
        ProvideDefaultSorting(ref query);
        if (oldQuery.Equals(query)) // the partial method did nothing with the query, or just didn't exist
        {
            query = query.OrderBy(c => c.CategoryID);
        }
        return query.Skip(startIndex).Take(count);
    }
    // the rest..        
}

public partial class Repository
{
    partial void ProvideDefaultSorting(ref IOrderedQueryable<Category> currentQuery)
    {
        currentQuery = currentQuery.Where(c => c.CategoryName.Contains(" ")).OrderBy(c => c.CategoryName); // compile time forced sotring
    }
}

Это гарантирует во время компиляции, чтобы, если частичный метод реализован, это, по крайней мере, сохранило это IOrderdQueryable.

И когда частичный метод не реализован или просто возвращает свой параметр, запрос не будет изменен, и это будет использовать вид нейтрализации.

1
ответ дан 17 December 2019 в 04:53
поделиться

Я боюсь, что это немного более твердо, чем это. Вы видите, Платформа Объекта будет, при определенных обстоятельствах, тихо игнорировать OrderBy. Таким образом, не достаточно просто искать OrderBy в дереве выражений. OrderBy должен быть в "правильном" месте, и определением "правильного" места является деталь реализации Платформы Объекта.

Как Вы, возможно, предположили к настоящему времени, я нахожусь в том же месте, как Вы; я использую шаблон репозитория объекта и делаю Брать/Пропущение на уровне представления. Решение, которое я использовал, который, возможно, не идеален, но достаточно хорош для того, что я делаю, не состоит в том, чтобы сделать никакого упорядочивания до прошлого момента, чтобы гарантировать, что OrderBy всегда является последней вещью в дерево выражений. Таким образом, любое действие, которое собирается сделать Брать/Пропущение (прямо или косвенно), вводит OrderBy сначала. Код структурирован таким образом, что это может только произойти однажды.

1
ответ дан 17 December 2019 в 04:53
поделиться
    ProvideDefaultSorting(ref query);
    if (!IsSorted(query))
    {
            query = query.OrderBy(c => c.CategoryID);
    }

Изменение в:

    //apply a default ordering
    query = query.OrderBy(c => c.CategoryID);
    //add to the ordering
    ProvideDefaultSorting(ref query);

Это не идеальное решение.

Это не решает, "просачиваются проблема" функции упорядочивания, которую Вы заявили. Это действительно решает, "Я забыл реализовывать упорядочивание" или "Я принимаю решение не заказать".

Я протестировал это решение в LinqToSql:

    public void OrderManyTimes()
    {
        DataClasses1DataContext myDC = new DataClasses1DataContext();
        var query = myDC.Customers.OrderBy(c => c.Field3);
        query = query.OrderBy(c => c.Field2);
        query = query.OrderBy(c => c.Field1);

        Console.WriteLine(myDC.GetCommand(query).CommandText);

    }

Генерирует (отметьте обратный порядок упорядочиваний):

SELECT Field1, Field2, Field3
FROM [dbo].[Customers] AS [t0]
ORDER BY [t0].[Field1], [t0].[Field2], [t0].[Field3]
0
ответ дан 17 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: