Entity Framework возвращает запрос отложенной загрузки и применяет фильтры другим способом - PullRequest
0 голосов
/ 22 марта 2020

У меня большой базовый запрос, в который я хотел бы добавить условные фильтры Где в различных методах. Я надеялся использовать отложенную загрузку, чтобы создать базовый запрос в методе и вызывать его в других местах в различных местах, которые я добавляю условные предложения where, а затем выполняю в конце.

Я пробовал что-то вроде:

public IEnumerable<MyModel> GetBaseQuery()
{

    IEnumerable<MyModel> base= context.MyTable1.Join(...{lot of joins here})
        .Select{
        ...select all of required fields for my model
        }
    return base;
}

public IEnumerable<MyModel> GetResultsByKeyword()
{
    IEnumerable<MyModel> model= GetBaseQuery();
    if(condition1 is true)
    {
        model = model.Where(x => x.Field1 == "Field1Value");
    }
    if(condition2 is true)
    {
        model = model.Where(x => x.Field2 == "Field2Value");
    }

    return model.Tolist(); //execute the query when calling ToList()
}

Выше не возвращает результатов, но если я соберу все в один большой метод, то он сделает то, что я хочу. Мой реальный дизайн, вероятно, имеет около 7 различных методов, которые будут вызывать «базовый» запрос, и я стараюсь избегать репликации базового запроса в каждом методе для 1) удобочитаемости и 2) текущего обслуживания, если запрос когда-либо нужно редактировать в добавить больше полей.

1 Ответ

1 голос
/ 23 марта 2020

Два комментария указывают на две проблемы кода. Использование IEnumerable выполнит запрос до оценки дополнительных предикатов запроса, и они будут оценены в памяти. И, во-вторых, .Where не изменяет IQueryable / IEnumerable, он возвращает новый IQueryable / IEnumerable.

Так должно быть что-то вроде:

public IQueryable<MyModel> GetBaseQuery()
{

    var base = context.MyTable1. . . .
    return base;
}

public ICollection<MyModel> GetResultsByKeyword()
{
    IQueryable<MyModel> qry = GetBaseQuery();
    if (condition1 is true)
    {
        qry = qry.Where(x => x.Field1 == "Field1Value");
    }
    if (condition2 is true)
    {
        qry = qry.Where(x => x.Field2 == "Field2Value");
    }

    return qry.Tolist(); //execute the query when calling ToList()
}
...