Я использую LINQ to SQL и разрешаю пользователям настраивать запрос, присваивая значения queryStrings в пользовательском интерфейсе. Я настроил основной запрос на возврат результата IQueryable, а затем продолжил уточнение набора результатов, продолжая воздействовать на результирующий объект IQueryable. Все отлично работает, и код выглядит примерно так
var result = (from record in db.Companies
select new Company
{
Id = record.Id,
Name = record.Name,
City = record.City,
Status = record.Status
});
if (queryName != null && queryName!= "")
{
result = result.Where(p => p.Name.Contains(queryName));
}
if (queryCity != null && queryCity!= "")
{
result = result.Where(p => p.City.StartsWith(queryCity));
}
Теперь я хочу расширить запрос, сопоставляя его с набором элементов, аналогичных «IN CLAUSE» в SQL. Где есть список элементов для использования в запросе, например,
string[] queryStatusList = {"x", "y" };
А теперь я могу написать такой код, и все по-прежнему в порядке.
var result = (from record in db.Companies
where queryStatusList.Contains(record.status)
select new Company
{
Id = record.Id,
Name = record.Name,
City = record.City,
Status = record.Status
});
if (queryName != null && queryName!= "")
{
result = result.Where(p => p.Name.Contains(queryName));
}
if (queryCity != null && queryCity!= "")
{
result = result.Where(p => p.City.StartsWith(queryCity));
}
Но я не хочу иметь предложение where в начальном запросе. Я хочу построить из уточненного результата запроса, как это было сделано в предыдущем примере. Мой вопрос: как бы я структурировал такой запрос? Я пытался
if (queryStatusList != null && queryStatusList.Count() > 0)
{
result = result.Where(queryStatusList.Contains(result.Select(p => p.Status.ToString())));
}
Но я получаю ошибку компилятора: «Аргументы типа для метода« System.Linq.Enumerable.Contains (System.Collections.Generic.IEnumerable, TSource) »не могут быть выведены из использования. Попробуйте указать аргументы типа явно ». Я пробовал несколько вариантов, но я не уверен, как решить проблему.