LINQ& Lambda表达式相当于SQL In

时间:2010-12-14 11:25:03

标签: sql lambda

是否有相当于IN的lambda?我想选择ID为4,5或6的所有资金。一种写作方式是:

  

列出fundHistoricalPrices = lionContext.FundHistoricalPrices.Where(fhp => fhp.Fund.FundId == 5 || fhp.Fund.FundId == 6 || fhp.Fund.FundId == 7).ToList();

然而,如果我需要它来匹配100个不同的fundIds,那很快就会变得无法管理。我可以这样做:

  

列表   fundHistoricalPrices =   lionContext.FundHistoricalPrices.Where(FHP   => fhp.Fund.FundId in(5,6,7))。ToList();

4 个答案:

答案 0 :(得分:1)

这是沿着这些方向的某个方面,但我不太同意你采取的方法。但如果您真的想这样做,这将会做到:

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

您可能希望在LINQ查询之前构建ID列表...

答案 1 :(得分:0)

您可以对集合使用Contains()方法来获得等效于in的内容。

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

var fundHistoricalPrices = lionContext.FundHistoricalPrices.Where(fhp => fundIds.Contains(fhp.Fund.FundId)).ToList();

答案 2 :(得分:0)

您可以编写如下的扩展方法:

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();

答案 3 :(得分:0)

不,我所知道的唯一类似的运算符是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);