C# 在LINQ to SQL中选择“IN”

C# 在LINQ to SQL中选择“IN”,c#,.net,sql,linq,linq-to-sql,C#,.net,Sql,Linq,Linq To Sql,我得到一个要更新的实体列表,我有它们的ID。我想从数据库中获取原始数据,因此我会: String[] ids = updatedEvents.Select(ue => ue.id).ToArray(); var originalEventsToUpdate = Db.tbl_ffk_event .Where(e => ids.Contains(e.id)) .

我得到一个要更新的实体列表,我有它们的ID。我想从数据库中获取原始数据,因此我会:

String[] ids = updatedEvents.Select(ue => ue.id).ToArray();

var originalEventsToUpdate = Db.tbl_ffk_event
                               .Where(e => ids.Contains(e.id))
                               .ToArray();
但我使用日志得到的是生成的SQL:

SELECT [t0].[id], [t0].[fs_mapping_id], [t0].[fs_id_value], [t0].[desc]
FROM [dbo].[tbl_ffk_event] AS [t0]
WHERE 0 = 1
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
SQL意味着获取整个表

如何生成一个类似于以下内容的输入:

SELECT [t0].[id], [t0].[fs_mapping_id], [t0].[fs_id_value], [t0].[desc]
FROM [dbo].[tbl_ffk_event] AS [t0]
WHERE [t0].[id] IN ('aaa','bbb','ccc','ddd','eee',)
提前谢谢

编辑:


我觉得自己很愚蠢,我没有看到0=1的位置。这是因为在这一点上,ids集合中没有任何内容。我现在已经签出,以确保有项目,并且SQL生成正确。抱歉。

实际上,由于0=1的子句,此SQL将返回一个空记录集,即根据架构正确映射,但没有行

您给出的代码似乎是正确的,但有些东西使查询提供程序确信,永远不会有匹配的行


假设这不正确,我将查看id属性的列映射。它与数据库的匹配是否正确?

可能您的列表为空,这是Linq的正常行为。

尝试以下操作:

Dim strval As String = ""
Dim strnum(30) As String

strval = "1,2,3,4,5,6,7,9"

strnum = strval.split(",")

originalEventsToUpdate = (from a in Db.tbl_ffk_event where strnum.contains(a.id) select a).tolist

您说过,SQL的意思是“获取整个表”。我想你的意思是“一无所获”。WHERE子句总是错误的。你的ID真的是字符串吗?我想它说的是‘WHERE 1=1’,我没有意识到。vtortola的重复,我不会觉得这是愚蠢的,因为SQL的格式是正确的,它必须做一些出乎意料的事情。考虑到[t0].[id]所在的位置将是无效的,我认为这是非常明智的。聪明的老林克;我以为上面写着“WHERE 1=1”,我没有意识到这一点。那么映射呢,它是否像我怀疑的那样揭示了问题?如果没有,也许可以添加到你的问题中。仅供参考:这段代码是VB.NET,而不是问题中的C。VB有LINQ吗?我真的不知道。我想他们在周二把LINQ加入了vb