LINQ to SQL - дальнейшее изменение результирующего набора IQueryable с помощью Contains - PullRequest
1 голос
/ 05 марта 2010

Я использую 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) »не могут быть выведены из использования. Попробуйте указать аргументы типа явно ». Я пробовал несколько вариантов, но я не уверен, как решить проблему.

1 Ответ

1 голос
/ 05 марта 2010

Я думаю, что если вы немного измените его, это может сработать:

if (queryStatusList != null && queryStatusList.Count() > 0) 
{ 
    result = result.Where( r=> queryStatusList.Contains( r.Status )); 
}

С другой стороны, вы можете захотеть использовать PredicateBuilder для создания единственного Гдепункт выбора и использовать его вместо.PredicateBuilder предоставит вам больше контроля и возможность создавать сложные запросы с сочетанием предложений AND и OR, в то же время создавая их динамически.

var predicate = PredicateBuilder.True<Company>();

if (queryName != null && queryName!= "") 
{ 
    predicate = predicate.And( p => p.Name.Contains(queryName) );
} 

if (queryCity != null && queryCity!= "") 
{ 
   predicate = predicate.And(p => p.City.StartsWith(queryCity)); 
}

if (queryStatusList != null && queryStatusList.Count() > 0) 
{ 
    predicate = predicate.And( p => queryStatusList.Contains( p.Status )); 
}

var result = db.Companies
               .Select( c => new Company 
                { 
                    Id = record.Id, 
                    Name = record.Name, 
                    City = record.City, 
                    Status = record.Status 
                }
               .Where( predicate );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...