2011-03-28 96 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