使用.Contains()与linq-to-sql

3
我有以下查询,该查询接收一个int列表作为参数:
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()方法更好的方式?

谢谢。


为什么你正在寻找更好的方式?你认为现在做的有什么不好的地方? - svick
3个回答

9

你所说的是正确的。这将被翻译成SQL中的IN子句,其值由集合提供。

另外一件事,你应该尝试按日期 降序 排序查询,并使用FirstOrDefault()。现在,你将会带回整个结果集并且丢弃除了一个条目之外的所有行。


LastOrDefault 甚至会抛出一个错误,表明这个 LINQ 无法将其转换为 SQL。 - Luke

4
你在使用 linq查询 时,需要小心使用包含 list.Contains() 的查询。因为对于每个列表元素,它都会在 sql语句 中创建一个参数
并且,在 sql语句 中允许的参数数量是有限的,<=2100。 因此,如果你的 TheIDs 包含超过 2100 个元素,它将会 失败
如果你想这样使用,你至少应该检查你的 TheIDscount,如果超过了2100,将其分成不到 2100 个元素的片段。

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接