LINQ和参考列表问题

我有以下代码与LINQ

var q = (from web in DataContext.Webs select web); List k1 = new List() { 1, 2 }; List k2=new List() { 16, 17 }; q = q.Where(web => DataContext.WebTechMaps.Any(t => t.WebsiteId == web.WebsiteId && k1.Contains(t.TechId))); System.Diagnostics.Debug.WriteLine(q.Count()); k1 = k2; q = q.Where(web => DataContext.WebTechMaps.Any(t => t.WebsiteId == web.WebsiteId && k1.Contains(t.TechId))); System.Diagnostics.Debug.WriteLine(q.Count()); 

这是它生成的查询。

第一次执行计数。

 SELECT COUNT(*) AS [value] FROM [dbo].[Web] AS [t0] WHERE EXISTS( SELECT NULL AS [EMPTY] FROM [dbo].[WebTechMap] AS [t1] WHERE ([t1].[WebsiteId] = ([t0].[WebsiteId])) AND ([t1].[TechId] IN (@p0, @p1)) ) -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [1] -- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [2] 

第二次执行计数function

 SELECT COUNT(*) AS [value] FROM [dbo].[Web] AS [t0] WHERE (EXISTS( SELECT NULL AS [EMPTY] FROM [dbo].[WebTechMap] AS [t1] WHERE ([t1].[WebsiteId] = ([t0].[WebsiteId])) AND ([t1].[TechId] IN (@p0, @p1)) )) AND (EXISTS( SELECT NULL AS [EMPTY] FROM [dbo].[WebTechMap] AS [t2] WHERE ([t2].[WebsiteId] = ([t0].[WebsiteId])) AND ([t2].[TechId] IN (@p2, @p3)) )) -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [16] -- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [17] -- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [16] -- @p3: Input Int (Size = -1; Prec = 0; Scale = 0) [17] 

请查看传递给查询的参数。

似乎它使用两个表达式的新引用对象。

不知怎的,@ p0和@ p1改变了他们的旧值。 我明白问题是在Linq它使用新的引用对象。

 -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [1] -- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [2] -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [16] -- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [17] -- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [16] -- @p3: Input Int (Size = -1; Prec = 0; Scale = 0) [17] 

有人可以解释如何使用List对象的相同名称,但使用正确的List保持查询

期望的输出是

 -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [1] -- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [2] -- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [16] -- @p3: Input Int (Size = -1; Prec = 0; Scale = 0) [17] 

提前致谢

您的第一个查询表达式使用k1 。 它使用变量 kl ,这就是捕获的内容。 当您更改k1的值时,这实际上会更改查询的含义。 如果您不希望更改查询的含义,请不要更改捕获的变量! 只需在第二个filter中使用k2

 var q = (from web in DataContext.Webs select web); List k1 = new List() { 1, 2 }; List k2=new List() { 16, 17 }; q = q.Where(web => DataContext.WebTechMaps .Any(t => t.WebsiteId == web.WebsiteId && k1.Contains(t.TechId))); System.Diagnostics.Debug.WriteLine(q.Count()); q = q.Where(web => DataContext.WebTechMaps .Any(t => t.WebsiteId == web.WebsiteId && k2.Contains(t.TechId))); System.Diagnostics.Debug.WriteLine(q.Count());