LINQ和参考列表的问题 [英] Issue With LINQ and Reference List
问题描述
我在LINQ上有以下代码
I Have following code with LINQ
var q = (from web in DataContext.Webs select web);
List<int?> k1 = new List<int?>() { 1, 2 };
List<int?> k2=new List<int?>() { 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]
第二次执行计数功能
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]
请查看传递给查询的参数.
Please Take a look at the parameters passed to query.
似乎它对两个表达式都使用了新的引用对象.
Seems it uses the new referenced object for both Expressions.
@ p0和@ p1会以某种方式更改其旧值. 我了解此问题是在Linq中,它使用了新的引用对象.
Somehow @p0 and @p1 change their old values. I understand that issue is in Linq it uses new referenced object.
-- @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保留查询吗
Can someone explain how to use same name of List object but keep the query using correct List's
所需的输出是
-- @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
的值时,实际上是在更改查询的含义.如果您不想更改查询的含义,请不要更改捕获的变量!只需在第二个过滤器中使用k2
:
Your first query expression uses k1
. It uses the variable kl
, and that's what's captured. When you change the value of k1
, that's effectively changing the meaning of the query. If you don't want the meaning of the query to change, don't change the captured variables! Just use k2
in your second filter:
var q = (from web in DataContext.Webs select web);
List<int?> k1 = new List<int?>() { 1, 2 };
List<int?> k2=new List<int?>() { 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());
这篇关于LINQ和参考列表的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!