C# 如何强制SQL server执行Linq to SQL where子句中的.Contains?

C# 如何强制SQL server执行Linq to SQL where子句中的.Contains?,c#,linq-to-sql,C#,Linq To Sql,我有一个Linq到SQL查询中使用的行ID列表 using (var db = new DataContext(dbConnectionString)) { ids = new list<long> {"1","2",...}; var data = (from item in db.GetTable<dataTable>().AsEnumerable() where ids.Contains(item.ID)

我有一个Linq到SQL查询中使用的行ID列表

using (var db = new DataContext(dbConnectionString))
{
   ids = new list<long> {"1","2",...};
   var data = (from item in db.GetTable<dataTable>().AsEnumerable()
               where ids.Contains(item.ID)
               select new customDataStructure{}).ToList();
}
在某些情况下,它将列表中的每个ID作为参数传递给SQL,格式为@p0、@p1、,。。。。在其他情况下,查询将检索所有记录,并允许在c中进行筛选。如果检索到的数据量非常大,这将导致内存使用量大幅增加,并可能导致内存异常


是否可以强制查询在SQL server上执行where以避免此问题?

使用.Contains不是我认为您想要使用的。我想您应该使用.Any,它将查看列表中的任何项是否与表中的属性或列匹配。见下文:

var ids = new List<long> {1,2};
var data = (from item in db.GetTable<dataTable>().AsEnumerable()
where ids.Any(m=> m == item.Property)
select new customDataStructure{}).ToList();

正如Evk所评论的,AsEnumerable导致where在本地执行,而不是在SQL server上执行

之所以使用它,是因为我需要返回类型中的列表和字典,如果您试图在IQueryable中构建它们,就会导致异常

我把问题改为

using (var db = new DataContext(dbConnectionString))
{
   ids = new list<long> {"1","2",...};
   var data = (from item in db.GetTable<dataTable>()
               where ids.Contains(item.ID)
               select new 
               {
                  name = item.name,
                  subIds = item.subitemIDs
                  ...
               }).AsEnumerable()
               .Select(x=> new customDataStructure
                   {
                      itemname = x.name,
                      subIds = x.subIds.ToList(),
                      ...
                   }).ToList();
}

它让数据收集由SQL完成,然后在SQL执行后完成所需的结构。

我认为您不想使用.Contains。使用.any,因为你正在做一个可数的——之后的所有事情都发生在内存中,尽管我必须承认我没有使用ling-to-sql的经验,但一般来说它是这样工作的。为什么要这样做?我这样做是因为需要填充的自定义数据类型包括字典和列表,如果它不可计算,则会导致其他错误。我修改了查询以返回一个新的匿名类型,不包含任何列表或字典,然后调用AsEnumerable.Selectx=>x=newCustomDataStructure{}这将contains作为where in子句执行,应该可以满足我的需要。在检索数据后,切换到Any仍然会在代码中进行筛选,而不是在sql server上进行筛选。是的,这是一种有效的方法。