Используя содержит () в LINQ к SQL

Я пытаюсь реализовать очень простой поиск по ключевым словам в приложении с помощью linq-to-sql. Мои критерии поиска находятся в массиве строк, при этом каждый объект массива является одним словом, и я хотел бы найти строки, которые содержат критерии поиска. Я не возражаю, если они будут содержать больше, чем просто критерии поиска (скорее всего, то они будут), но все критерии поиска действительно должны присутствовать.

Идеально, я хотел бы что-то подобное отрывку ниже, но я знаю, что это не будет работать. Кроме того, я посмотрел на этот вопрос здесь, но автор того вопроса кажется довольным сделать вещи наоборот ( query.Contains(part.partName) ), который не работает на меня.

public IQueryable SearchForParts(string[] query)
{
    return from part in db.Parts
           where part.partName.Contains(query)
           select part;
}

Как я могу переписать этот запрос так, чтобы он сделал то, в чем я нуждаюсь?

38
задан Community 23 May 2017 в 12:02
поделиться

4 ответа

Глядя на другие попытки, мне становится грустно :(

public IQueryable<Part> SearchForParts(string[] query)
{
  var q = db.Parts.AsQueryable(); 

  foreach (var qs in query)
  { 
    var likestr = string.Format("%{0}%", qs);
    q = q.Where(x => SqlMethods.Like(x.partName, likestr));
  }

  return q;
}

Предположения:

  • partName выглядит как: "ABC 123 XYZ"

  • query is { "ABC", "123", "XY" }

42
ответ дан 27 November 2019 в 03:40
поделиться

пожалуйста, попробуйте следующее:

public IQueryable<Part> SearchForParts(string[] query)
{
    return from part in db.Parts
           where Search(part.Name,query)
           select part;
}

public bool Search(string partName,string[] query)
{
    for (int i = 0; i < query.Length; i++)
    {
        if(partName.Contains(query[i]))
           return true;
    }

    return false;
}
-3
ответ дан 27 November 2019 в 03:40
поделиться

Вы можете записать это так

var result = db.Parts.Where(p => query.All(q => p.partName.Contains(q)));
1
ответ дан 27 November 2019 в 03:40
поделиться

Вы можете попробовать:

public IQueryable<Part> SearchForParts(string[] query)
{
    return from part in db.Parts
           where query.All(term => part.partName.Contains(term))
           select part;
}

Однако я не уверен, сможет ли LINQ to SQL преобразовать его в T-SQL. Другой вариант:

public IQueryable<Part> SearchForParts(string[] query)
{
    var result = from part in db.Parts
                 select part;

    foreach(var term in query)
    {
        result = from part in result
                 where part.partName.Contains(term)
                 select part;
    }

    return result;
}

Это не так красиво, но должно работать. Вы получите запрос с множеством И в предложении where.

2
ответ дан 27 November 2019 в 03:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: