Создайте пустой IQueryable <T>для Linq до SQL и объедините его позже - PullRequest
2 голосов
/ 12 февраля 2020

Я хотел бы создать функцию, которая создает некоторые Linq для SQL, которые я могу позже добавить в существующий IQueryable. Для моих примеров я использую человека (T) с правильной фамилией.

Я хотел бы выполнить sh что-то вроде этого:

var surnameFilter = GetSurnameFilter(surname);
var finalQuery = _context.Persons.Concat(filterQuery);
var persons = finalQuery.ToList();

private IQueryable<Person> GetSurnameFilter(string surname)
{
     // Create empty IQueryable<Person>
     IQueryable<Person> query = Enumerable.Empty<Person>().AsQueryable();
     return query.Where(k => k.Surname.Contains(surname));
}

Но тогда я получаю следующую ошибку:

System.InvalidOperationException: «Не удалось обработать выражение LINQ». Это может указывать либо на ошибку, либо на ограничение в EF Core. См. https://go.microsoft.com/fwlink/?linkid=2101433 для получения более подробной информации. '

Мне бы хотелось, чтобы я мог выбрать, какой фильтр добавить позже. Я знаю, это просто мелочь, но я предпочитаю сопоставить фильтр-запрос с основным запросом для удобства чтения и простоты использования. После некоторой отладки я отправил его на каст при создании пустого IQueryable<Person>. Я заставил это работать, когда я делаю это, но это не то, что я хочу:

var finalQuery = AddFilter(_context.Persons, surnameFilter);
var persons= finalQuery.ToList();

private IQueryable<Person> AddFilter(IQueryable<Person> query, string surname)
{
    return query.Where(k => k.Surname.Contains(surname));
}

1 Ответ

1 голос
/ 12 февраля 2020

Я думаю, вы могли бы выполнить sh что-то вроде этого с Расширения

У меня есть следующая модель

    public class WeatherForecast
    {
        public DateTime Date { get; set; }

        public int TemperatureC { get; set; }

        public int TemperatureF => 32 + (int) (TemperatureC / 0.5556);

        public string Summary { get; set; }
    }

Затем я могу создать класс Extension, который содержит методы для этого типа c:

    public static class WeatherForecastExtensions
    {
        public static IQueryable<WeatherForecast> AddFilter(this IQueryable<WeatherForecast> queryable, string str)
        {
            return queryable
                .Where(forecast => forecast.Summary != null)
                .Where(forecast => forecast.Summary.Contains(str));
        }
    }

Вы можете назвать его так:

            var forecasts = new List<WeatherForecast>();
            var filtered = forecasts.AsQueryable()
                .AddFilter("cold")
                .ToList();

Имейте в виду, что эти расширения будут работать только для IQueryable s, которые содержит объект Weatherforecast.

...