Как переписать LINQ Any (), чтобы сделать его подходящим для .NET 3.5 - PullRequest
2 голосов
/ 28 марта 2012

У меня есть следующий 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.

Проблема BIG в том, что я вынужден использовать этот код в .NET 3.5 , и я только что обнаружил, что Any и Contains (метод LINQ, а не один применяется к строкам) не работают в этих рамках. Это настоящая боль. Код слишком велик, чтобы все переписать, а крайний срок слишком близок.

Я нашел эту статью действительно интересной, но я не могу заставить ее работать в моем случае. Кто-нибудь может помочь?

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Что такое:

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));
0 голосов
/ 28 марта 2012

вы могли бы сначала запросить any и сохранить это в перечислимом и проверить, если число больше 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...