C# 实体框架不返回重复的匹配项

C# 实体框架不返回重复的匹配项,c#,C#,我在实体框架中发现了一个有趣的问题。检查下面的代码。在这里,我使用Contains从表Test1中查找所有匹配的Id行,但当我多次添加相同的Id时,它只返回1个项,而不是重复的项,但我也希望获得重复的项。那我怎么做呢 var ids = new List<int>(); ids.Add(1); ids.Add(1); var foo = ctx.Test1.Include("Test2").Where

我在实体框架中发现了一个有趣的问题。检查下面的代码。在这里,我使用Contains从表Test1中查找所有匹配的Id行,但当我多次添加相同的Id时,它只返回1个项,而不是重复的项,但我也希望获得重复的项。那我怎么做呢

var ids = new List<int>();
                ids.Add(1);
                ids.Add(1);
var foo = ctx.Test1.Include("Test2").Where(x => ids.Contains(x.Id)).ToList();

你不能。您确实需要学习SQL如何工作以及查询如何工作的基本知识,因为您的问题是一个基本的误解

当我多次添加相同的id时,它只返回1个项目,而不是重复的项目

因为该表仍然只包含1项。如果多次添加同一ID,为什么希望它多次返回该行

评估方法如下:

吵架 检查ID是否与提供的任何列表匹配。 下一排。 因此,无论您多长时间将该ID放入已批准ID的列表,它显然只会返回一行。您不会得到重复的项目,因为您没有重复的项目开始

就像经常使用任何与Ef相关的东西一样,它也有助于截取和查看生成的SQL和生成的查询计划-这至少会清楚地表明,您无法获得2个id。Contains将是一个IN子句,包含值列表。正如我上面所说,包含对行的检查,它不会神奇地复制它们


我建议在查询后手动进行复制-虽然25年来我从未见过出现这种要求,因此我强烈建议您首先从更高的角度检查您尝试的操作是否具有逻辑意义。

为什么应该是另一种方式?EF Contains指令的SQL格式为:

SELECT 
...
FROM ...
WHERE ... IN (1, 1)

如果你觉得这不太可能。你如何向自己证明这一点?你确定你指向的是正确的数据库吗?这绝对不是不可能的。这就是efcore和sql从一开始就是如何工作的。