Обзор основной метод репозитория эф


Что вы думаете об этой основной метод эф ?

Также обратите внимание, что он возвращает интерфейс IQueryable:

Это может быть опасность производительность при расширенных неправильно ? Как ?

Примите тот факт, что включает в себя и Заказатьпо параметры строкового типа.

public IQueryable<TEntity> GetEntitySetMultipleTables(Expression<Func<TEntity, bool>> WhereExpression = null,
                                                string OrderBy = null,
                                                int TotalResults = int.MaxValue, int SkippedResults = 0, string[] Includes = null)
    {
        if (OrderBy != null)
        {
            string orderbyProperty = OrderBy;
            if (OrderBy.IndexOf(' ') > -1) // Direction
            {
                orderbyProperty = OrderBy.Substring(0, OrderBy.IndexOf(' '));
            }

            if (typeof(TEntity).GetProperty(orderbyProperty) == null)
                OrderBy = null;
        }
        if ((SkippedResults > 0) && (OrderBy == null))
        {
            OrderBy = GetPrimaryKeyName();
        }

        //Base EntitySet
        IQueryable<TEntity> results;
        ObjectQuery<TEntity> objectSetResults = Context.CreateObjectSet<TEntity>();
        if (Includes == null)
            results = objectSetResults.AsQueryable();
        else
        {
            foreach (var include in Includes)
            {
                objectSetResults = objectSetResults.Include(include.Trim());
            }
            results = objectSetResults.AsQueryable();
        }

        //Filter by Where Expression
        if (WhereExpression != null)
            results = results.Where(WhereExpression);

        //Order Results
        if (OrderBy != null)
        {
            results = results.OrderBy(OrderBy);
        }

        //Skip Records
        if (SkippedResults > 0)
            results = results.Skip(SkippedResults);

        //Take Specific Amount of records
        if (TotalResults != int.MaxValue)
            results = results.Take(TotalResults);

        //Run the LINQ Query and return the results
        return results;
    }

Спасибо заранее.



519
1
задан 30 ноября 2011 в 01:11 Источник Поделиться
Комментарии
2 ответа

Я не уверен, как этот код работает (мне пришлось изобрести GetPrimaryKeyName) и я не могу найти интерфейс IQueryable что имеет Заказатьпо , который принимает строковый параметр. Так притворяется он, насколько это возможно, я придумал это:

    public IQueryable<TEntity> GetEntitySetMultipleTables(
Expression<Func<TEntity, bool>> whereExpression = null,
string orderBy = null,
int? totalResults = null,
int? skippedResults = null,
string[] includes = null)
{
PropertyInfo orderbyProperty;
int directionIndex;

if (orderBy == null)
{
directionIndex = -1;
orderbyProperty = null;
}
else
{
directionIndex = orderBy.IndexOf(' ');

// Direction.
if (directionIndex > -1)
{
orderBy = orderBy.Substring(0, directionIndex);
}

orderbyProperty = typeof(TEntity).GetProperty(orderBy);
}

if ((skippedResults != null) && ((int)skippedResults > 0) && (orderbyProperty == null))
{
orderbyProperty = typeof(TEntity).GetProperty(GetPrimaryKeyName());
}

// Base EntitySet.
ObjectQuery<TEntity> objectSetResults = Context.CreateObjectSet<TEntity>();
var results = includes == null
? objectSetResults.AsQueryable()
: includes.Aggregate(objectSetResults, (current, include) => current.Include(include.Trim())).AsQueryable();

// Filter by Where Expression.
if (whereExpression != null)
{
results = results.Where(whereExpression);
}

// Order Results.
if (orderbyProperty != null)
{
results = directionIndex > -1
? results.OrderByDescending(result => orderbyProperty.GetValue(result, null))
: results.OrderBy(result => orderbyProperty.GetValue(result, null));
}

// Skip Records.
if ((skippedResults != null) && ((int)skippedResults > 0))
{
results = results.Skip((int)skippedResults);
}

// Take Specific Amount of records.
if ((totalResults != null) && (totalResults > 0))
{
results = results.Take((int)totalResults);
}

// Run the LINQ Query and return the results.
return results;
}

1
ответ дан 30 ноября 2011 в 11:11 Источник Поделиться

Несколько мыслей:


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

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

  • Метод "GetPrimaryKey" очень вводит в заблуждение, видимо
    возвращает одну строку, но первичный ключ может состоять из нескольких
    столбцы.

  • Другой запах код, который указывает слишком много обязанностей (и бедные
    именование) - это комментарии, объясняя простой код. Вы должны быть
    выполнять эти блоки в методы или объекты.

0
ответ дан 31 декабря 2011 в 03:12 Источник Поделиться