Как переписать LINQ Any(), чтобы сделать его подходящим для.NET 3.5
У меня есть следующий класс EF:
class Product
{
public int ProdId { get; set; }
public int ProdDesc { get; set; }
public int ProdKeywords { get; set; }
}
Теперь я должен реализовать функцию поиска, которая смотрит на ProdDesc
а также ProdKeywords
, Ключевые слова зарегистрированы в array
и сбор продуктов в IQueryable
string[] keywordsArray = new string[] {"kw1", "kw2", ..., "kwN"};
IQueryable<Product> products = repository.GetProducts();
Чтобы увидеть, есть ли продукты, соответствующие ключевым словам, я использую следующий LINQ:
var matchingProducts = products.Where(p => keywordsArray.Any(k => p.ProdDesc.Contains(k) ||
p.ProdKeywords.Contains(k));
который работает как шарм в.NET 4.
Большая проблема заключается в том, что я вынужден использовать этот код в .NET 3.5, и я только что обнаружил, что Any
а также Contains
(метод LINQ, а не тот, который применяется к строкам) не работает в этой среде. Это настоящая боль. Код слишком большой, чтобы все переписать, а крайний срок слишком близок.
Я нашел эту статью действительно интересной, но я не могу заставить ее работать в моем случае. Кто-нибудь может помочь?
2 ответа
Что насчет:
static class Extension
{
public static bool Contains(this IEnumerable<object> source, object value)
{
foreach (object o in source)
if (o.Equals(value)) return true;
return false;
}
}
var mylist = keywordsArray.ToList();
matchingProducts = products.Where(p => mylist.Exists(k => p.ProdDesc.Contains(k) ||
p.ProdKeywords.Contains(k));
Вы можете запросить сначала any и сохранить это в перечислимом и проверить, если число больше 0