LINQ и лямбда-выражения, эквивалентные SQL In - PullRequest
3 голосов
/ 14 декабря 2010

Есть ли лямбда-эквивалент IN? Я хотел бы выбрать все средства с идентификаторами 4, 5 или 6. Один из способов написать это:

Список fundHistoricalPrices = lionContext.FundHistoricalPrices.Where (fhp => fhp.Fund.FundId == 5 || fhp.Fund.FundId == 6 || fhp.Fund.FundId == 7) .ToList ();

Однако, это быстро становится неуправляемым, если мне нужно, чтобы оно совпадало, скажем, с 100 различными фондами. Могу ли я сделать что-то вроде:

Список fundHistoricalPrices = lionContext.FundHistoricalPrices.Where (ФВЧ => fhp.Fund.FundId в (5,6,7)). ToList ();

Ответы [ 4 ]

1 голос
/ 14 декабря 2010

Это где-то в этом роде, но я не совсем согласен с вашим подходом.Но это подойдет, если вы действительно хотите это сделать:

.Where(fhp => new List<int>{5,6,7}.Contains( fhp.Fund.FundId )).ToList();

Возможно, вы захотите создать список идентификаторов перед вашим запросом LINQ ...

0 голосов
/ 14 декабря 2010

Нет, единственный похожий оператор, о котором я знаю, - это функция Contains ().

Еще одна задача - динамически построить запрос с помощью построителя предикатов из LINQkit: http://www.albahari.com/nutshell/predicatebuilder.aspx

Пример

int[] fundIds = new int[] { 5,6,7};

var predicate = PredicateBuilder.False<FundHistoricalPrice>();

foreach (int  id in fundIds)
{
    int tmp = id;
    predicate = predicate.Or (fhp => fhp.Fund.FundId == tmp);
}

var query = lionContext.FundHistoricalPrices.Where (predicate);
0 голосов
/ 14 декабря 2010

Вы можете написать метод расширения следующим образом:

public static bool In<T>(this T source, params T[] list)
{
  if(null==source) throw new ArgumentNullException("source");
  return list.Contains(source);
}

Тогда:

List fundHistoricalPrices = lionContext.FundHistoricalPrices.Where(fhp => fhp.Fund.FundId.In(5,6,7)).ToList();
0 голосов
/ 14 декабря 2010

Вы можете использовать метод Contains () в коллекции, чтобы получить эквивалент in.

var fundIds = new [] { 5, 6, 7 };

var fundHistoricalPrices = lionContext.FundHistoricalPrices.Where(fhp => fundIds.Contains(fhp.Fund.FundId)).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...