【问题标题】:using .Contains() with linq-to-sql将 .Contains() 与 linq-to-sql 一起使用
【发布时间】:2012-01-27 14:22:57
【问题描述】:

我有以下查询,它接收一个整数列表作为参数:

public int GetMostRecent(List<int> TheIDs)
{
 ...using MyDC...

   var TheMostRecentID = (from d in MyDC.Data
                           where TheIDs.Contains(d.ID)
                           orderby d.DateTime
                           select d.ID).LastOrDefault(); 
}

这是将参数集合中的列表与数据库中的数据进行匹配的最佳方法,还是有比使用 linq-to-sql 中的 .Contains() 方法更好的方法。

谢谢。

【问题讨论】:

  • 您为什么要寻找更好的方法?你认为你现在所做的事情有什么不好?

标签: c# asp.net linq linq-to-sql


【解决方案1】:

你所拥有的是正确的。这将使用集合中提供的值转换为 SQL 中的IN 子句。

在不相关的注释中,您应该尝试按日期降序对查询进行排序并使用FirstOrDefault()。就像现在一样,您将带回整个结果集并丢弃除一行之外的每一行。

【讨论】:

  • LastOrDefault 甚至会抛出此 linq 无法将其转换为 sql 的错误。
【解决方案2】:

您应该小心使用list.Contains()linq query 内的此类查询。因为对于每个列表元素,它将在sql statement 中创建一个param

而且 sql 语句中允许的参数数量有限,&lt;= 2100。 因此,如果您的 TheIDs 将包含多个 2100 元素,它将失败

如果您想以这种方式使用,您至少应该检查您的 TheIDs count,如果更多则 2100 将其与少于 2100 元素的部分分开。

【讨论】:

    【解决方案3】:

    这将转化为高效的 SQL,因此无需使用其他任何东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-23
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      相关资源
      最近更新 更多