我想從資料庫中過濾物體,但我有點堅持如何正確地將方法鏈接在一起......
用戶可以從一個文本欄位中搜索 ID、標題和描述。此 SearchString 將系結到 SearchData 中的 SearchString。
我有一個方法:
public List<Movies> Search(SearchData search)
{
var movies = from m in entities select m;
if (!String.isNullOrEmpty(search.SearchString))
{
movies = movies.Where(x => x.Title.Contains(search.SearchString)).Where(//descritpion);
}
return movies;
}
這有效,但我還需要檢查 Id
.Where(x=>x.Id == search.SearchString)
這不起作用,因為 Id 是 int 而 SearchString 是 String。
我嘗試了多種方法來做到這一點:我確實在 SearchString 上使用了“Convert.ToInt32”或在 Id 上使用了“Convert.ToString”,但出于某種原因,我不會得到任何回報,并且在搜索時出現錯誤對于一個字串。
我嘗試在 where 中使用塊:.Where(x => {if(Tryparse(Searchstring) {}else{}}),但是當我嘗試回傳 Movie 物件或 null 時它不喜歡它。
我還嘗試將子句拆分:
if (int.tryparse(searchstring))
movies = movies.where(x=>x.id ==Int32.Parse(SearchString));
movies = movies.where(//title and desc)
,但是由于標題和描述,我在 if 中找到的所有電影都將被過濾掉。
我的問題是:
1.)是否可以“拆分”這些方法,使它們的行為類似于 OR 而不是 AND?....或字串。我有更多要過濾的值,我也需要它。
2)如何在 Lambda 中針對更“復雜”的邏輯進行測驗?
uj5u.com熱心網友回復:
我不確定我是否理解正確,但是如果您想搜索 id == search.SearchString 的位置,以及使用 OR 的任何其他條件,那么您應該執行以下操作:
.Where(x=>x.Id == search.SearchString && (x.description.Contains(search.Description) || x.Title.Contains(search.Title) || x.Whatever.Contains(search.Whatever)));
uj5u.com熱心網友回復:
您可以在 Where 子句中使用 OR。
public List<Movies> Search(SearchData search)
{
var movies = from m in entities select m;
if (!String.IsNullOrEmpty(search.SearchString))
{
movies = movies.Where(x => x.Title.Contains(search.SearchString) || x.Description.Contains(search.SearchString));
}
return movies;
}
uj5u.com熱心網友回復:
我不明白為什么電影 Title應該包含電影 Id,在我看來這是不好的做法,
我認為您需要更新SearchData并為 Id 添加一個單獨的欄位,并將其用于過濾,這將使事情變得更加清晰和易于除錯
uj5u.com熱心網友回復:
為了尊重這兩個條件,我首先檢查搜索字串是否可以決議為整數。如果是這樣,您可以將 id 與它進行比較,如果不是,Id則應省略比較:
public List<Movies> Search(SearchData search)
{
var movies = from m in entities select m;
if (!String.isNullOrEmpty(search.SearchString))
{
int? searchId;
if (int.TryParse(search.SearchString, out i)
searchId = i;
else
searchId = null;
movies = movies.Where(x =>
(searchId.HasValue && x.Id == searchId.Value)
|| x.Title.Contains(search.SearchString)).Where(//descritpion);
}
return movies;
}
在比較中,第一部分檢查是否設定了 searchId,如果設定了,則將行的 id 與其進行比較。此外,它檢查標題是否包含搜索字串。如果滿足這兩個條件中的任何一個,則回傳該行。但是,如果用戶輸入123并且這既是有效的 id 又是標題的一部分,則將回傳這兩行。
如果要搜索 id (獨占)或文本的一部分,可以使用以下方法:
public List<Movies> Search(SearchData search)
{
var movies = from m in entities select m;
if (!String.isNullOrEmpty(search.SearchString))
{
Expression<Func<Movie, bool>> whereClause;
if (int.TryParse(search.SearchString, out searchId)
whereClause = (x) => x.Id == searchId;
else
whereClause = (x) => x.Title.Contains(search.SearchString);
movies = movies.Where(whereClause).Where(//descritpion);
}
return movies;
}
當輸入123時,上面的示例搜索 id,當輸入任何無法決議為整數的內容時,它會查找標題的一部分。
至于您的第二個問題:使用物體框架時,您的 lambda 運算式中的條件將轉換為 SQL。這限制了可用的選項。但是,如第一個示例所示,在許多情況下,您可以準備資料并相應地調整條件。然而,并不是每個有效的 lambda 運算式都可以轉換為 SQL。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510724.html
標籤:C#。网林克拉姆达
