2017-01-05 28 views
-2

我想要使用兩列過濾來自數據庫的數據。爲什麼我的LINQ Where子句連接字符串並使用值調用'contains'不起作用?

的事情是,用戶只張貼一個單一的領域,我將使用該字段來檢查是否有數據庫認爲連接兩列中的值存在的任何記錄。

此刻,我有以下幾點:

query 
    .Where(x => string 
    .Concat(x.Field1, " ", x.Field2) 
    .Contains(parameter.MyValue, StringComparison.InvariantCultureIgnoreCase)); 

我的問題是,沒有被過濾的數據,這是奇怪的,有沒有人知道發生了什麼事?謝謝!

+2

你只是調用'query.Where(...)'? 'Where' _returns_一個新的查詢,所以你需要'query = query.Where(...)'或'var filteredQuery = query.Where(...)',如果你想保持原始查詢不變。 –

+0

在lamba中放置一個斷點並觀察匹配結果 –

+0

@MatthewWhited這是一個將由查詢提供程序解析的表達式,而不是正在執行的方法。 – Servy

回答

1

因爲您的LINQ提供程序對Concat方法一無所知。用+運算符試一下。

+1

如果問題是查詢提供者不支持它,它會拋出一個錯誤說了很多,它不會忽略過濾器。 – Servy

+0

什麼查詢提供者會忽略使用的無效方法而不過濾數據?不同的提供商可能會以不同的方式失敗,但他們不會做任何事情。這不是我的問題。 – Servy

+0

這將取決於查詢提供程序。 –

2

你沒有提及你的數據庫提供者是什麼。不過你可以試試這個:

query 
    .Where(x => 
     ((x.Field1 ?? "") + " " + (x.Field2 ?? "")).Contains(parameter.MyValue)); 

此代碼假定您parameter及其MyValue屬性均爲不爲空,而後者也沒有空。

1

檢查的第一件事是確保所生成的SQL(我假設你正在查詢關係數據庫)時,在數據庫中直接運行工作。

你可以得到的SQL語句或者使用一個分析器,在Visual Studio調試會話期間,您可以通過跟蹤得到它,或者我的偏好是使用LinqPad。也試試these方法。

你的查詢看起來是正確的,我能夠得到它從我的數據庫返回結果。

的替代查詢:

query 
    .Where(x => x.Field1.Contains(parameter.MyValue) || x.Field2.Contains(parameter.MyValue)); 


query.Select(x => new 
        { 
        Field = string.Concat(x.Field1, " ", x.Field2), 
        RowData = x 
        }) 
    .Where(x => x.Field.Contains(parameter.MyValue)); 
相關問題