2011-03-28 99 views
4

我得到一个要更新的实体列表,并且我有他们的ID。我想从数据库中获取原始的,所以我做的:在LINQ to SQL中选择“IN”

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的意思是“让整个表”。

我如何可以生成一个 “IN” 是这样的:

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',) 

在此先感谢。

编辑:

我觉得自己很蠢,我没看到WHERE 0 = 1。这是因为在那个时候,ids集合中没有任何东西。我已经检查出确保有项目,并且SQL生成正确。抱歉。

+3

你说, “这意味着SQL '获取整个表'。”我认为你的意思是'一无所获'。 WHERE子句总是假的。 – 2011-03-28 11:09:32

+2

你的ID确实是字符串? – Pleun 2011-03-28 11:14:26

+0

我以为它说'Where 1 = 1'我没有意识到这一点。 – vtortola 2011-03-28 11:19:45

回答

2

实际上,由于第WHERE 0 = 1条款的规定,此SQL将返回一个空记录集(即根据模式正确映射,但没有行)。

您给出的代码似乎是正确的,但有些事实让查询提供者确信永远不会有匹配的行。

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

+0

我以为它说'Where 1 = 1'我没有意识到这一点。 – vtortola 2011-03-28 11:15:09

+1

映射怎么样,它是否揭示了我怀疑的问题(如果没有,可能将其添加到您的问题中)。 – 2011-03-28 11:16:21

0

大概你的清单空了,这是Linq的正常行为。

0

试试这个:

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 
+0

仅供参考:此代码是VB.NET,而不是C#中的问题。 (VB甚至有LINQ?我真的不知道。) – michaelb958 2013-07-01 14:07:36

+0

我认为他们在周二添加了LINQ到vb – SleepyBoBos 2014-06-16 05:02:11