2017-02-20 92 views
1

我有一個頁面'旅行'從中我得到我的searchTrip對象與用戶輸入的所有字段。用戶可能只輸入了其中的一些,例如,或只有,因此,我需要檢查值是否爲空,如果沒有,那麼我可以在我的linq查詢中使用它。過濾數據,檢查變量是否爲空之前檢查變量是否存在db

基本上如果旅行值沒有設置或爲空不檢查旅行是否包含它。與所有其他參數一樣。

var trips = db.Trips 
       .Where(u => 
       u.From.Contains(indexControllerViewData.SearchTrip.From) && 
       u.To.Contains(indexControllerViewData.SearchTrip.To) && 
       u.DepartureDate.Equals(indexControllerViewData.SearchTrip.DepartureDate) && 
       u.ReturnDate.Equals(indexControllerViewData.SearchTrip.ReturnDate)); 

回答

1

由於數據返回的視圖數據的屬性,在LINQ語句可以內置在一系列這樣

var searchTrip = indexControllerViewData.SearchTrip; 
var trips = db.Trips; 

if (!string.IsNullOrEmpty(searchTrip.From)) 
{ 
    trips.Where(u => u.From.Contains(searchTrip.From)) 
} 
if (!string.IsNullOrEmpty(searchTrip.To)) 
{ 
    trips.Where(u => u.To.Contains(searchTrip.To)) 
} 
// ... and so on 

該方法的基礎是LINQ語句可以建和Where條件不必一次指定。

請記住,這不是一個好的設計,因爲任何搜索條件的變化(可能會添加目標城市)都需要更改代碼。一個更強大的解決方案是將搜索行程標準作爲標準對象數組返回並遍歷它們 - 但是這需要更多的前期變化(可能是廣泛的),並且超出了問題的範圍。但如果這是你想要探索的東西,隨意問問另一個問題。

+0

是的,我想這就是我將堅持這一正確的現在。我在想數組,但我也使用了許多不同的類型DataType,int,float,所以它不會那麼簡單。 – Higeath

+0

很高興你有你的答案。不同類型的存在是爲什麼一組標準對象更直接 - 每個標準對象知道如何處理其案例的細節。初始設置需要多一點時間,但之後更容易。 –

0

我認爲最好的方法是將調用分開並使用if語句檢查表單值。如果有值,則修改查詢以過濾該值。

例如

var trips = db.Trips.Where(u => u.Active) //or what ever initial query you want to do, preferably on a value that is required. 

if(indexControllerViewData.SearchTrip.From.hasValue) //check that there is a value (I dont know what type the From value is) 
{ 
    trips = trips.where(u => u.From.contains(indexControllerViewData.SearchTrip.From)); 
} 

爲旅行是一個IQueryable和調用時被執行的語句這不損失效率。

0

您可以使用Coalesce運算符:??

//usage: 
//string notNullValue = table.NullableColumn ?? ""; 

... u.From.Contains(indexControllerViewData.SearchTrip.From ?? "")... 

此處瞭解詳情: MSDN Coalesce Operator : '??'