2017-09-21 98 views
-2

我有下面的代碼使用包含字符串列表?

var project = db.Projects.FirstOrDefault(x => projectIds.Contains(x.ProjectId)); 

如果projectIdsList<string>包含 「1234567」,並x.ProjectId「1234」,它將返回項目ProjectId是。

如何獲得正確的項目如果其'ProjectId「1234567」

感謝您的支持!

+1

在第一種情況下,您應該問自己,爲什麼是nvarchar類型的項目ID?! –

+2

你確定你的代碼不工作嗎?你調用一個List的Contains方法而不是一個字符串,所以它應該檢查列表是否包含完全匹配! – ssimeonov

+0

如果你不使用LINQ但是普通的舊版本會發生什麼? – Fildor

回答

3

Contains居然會在它的子,你需要在這裏是完全匹配,因此您可以嘗試使用此操作==像:

var project = db.Projects.FirstOrDefault(x => projectIds.Any(id=> id ==x.ProjectId)) 

現在,這將確保整個字符串值中與之相匹配。

+1

如果'projectIds'是'List '而'x.ProjectId'是'string',那麼'Contains'和你所建議的內容之間絕對沒有區別。 –

+0

List.Contains不查找子字符串:https://dotnetfiddle.net/XMEHy3 – Fildor

+0

List.Contains的工作方式與indexOf類似,只是在字符串中查找匹配項,並在找到它時返回一個bool ...所以說出來尋找一個子字符串是正確的,雖然它也可以是一個完整的字符串以及 – JohnChris

0

包含像通配符一樣的SQL,以獲得您需要使用的確切結果。任何擴展名而不是包含。請看這個例子來理解。

string[] x = { "abcd", "abc" }; 
string[] y = { "abcd", "abc", "abcde" }; 
var result= x.FirstOrDefault(a => y.Any(b => b == a)); 

result=abcd 

回答

var result = db.Projects.FirstOrDefault(x => projectIds.Any(p=> p==x.ProjectId)) 
+0

「包含像通配符一樣工作的SQL」 - 哪些「包含」? 'string.Contains'或'List .Contains' or ...? – Fildor

-1

我不會在未來使用

var project = db.Projects.FirstOrDefault(x => projectIds.Any(id=> id ==x.ProjectId)) 

string.Equals是有原因的取得,

var project = db.Projects.FirstOrDefault(x => projectIds.Any(id=> id.Equals(x.ProjectId)) 

然後你可以包括它所帶來的所有重寫,比如忽略大小寫和文化。在你的情況下,文化可能是值得的。例如,如果韓文窗口正在運行您的程序。

+0

爲什麼要投票?我錯了嗎? - 我愛一個沒有解釋的投票 – JohnChris

+0

我想這是因爲這個答案沒有回答這個問題。 – Fildor

+0

Equals會給你一個精確的匹配是OP要求的... – JohnChris