我想从数据库中过滤实体,但我有点纠结于如何正确地将方法链接在一起.
用户可以从一个Textfield中搜索Id、标题和描述。此SearchString将绑定到SearchString in SearchData中。
我有一个方法:
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是一个字符串。
我尝试过多种方法来做到这一点:我在SearchString上使用了“SearchString”,在Id上使用了"Convert.ToString“,但是由于某种原因,我在搜索字符串时不会得到任何信息和错误。
我尝试在where:.Where(x => {if(Tryparse(搜索字符串){}){}{}})中使用一个块,但是当我试图返回Movie或null时,它不喜欢它。
我还试图把这一条分开:
if (int.tryparse(searchstring))
movies = movies.where(x=>x.id ==Int32.Parse(SearchString));
movies = movies.where(//title and desc),但是有了这个,我在if中找到的所有电影都会因为标题和desc而被过滤掉。
我的问题是:
(1)是否有可能“拆分”这些方法,使其表现为OR而不是AND?或者因为用户只允许输入一个Int或一个字符串,所以在一个工作之后就不再执行它们了。我有更多的价值观,我正在过滤,我也需要这一点。
2)如何对Lambdas中的“复杂”逻辑进行测试?
发布于 2022-09-14 12:58:39
我不确定我是否正确地理解了它,但是如果您想搜索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)));发布于 2022-09-14 12:58:04
您可以在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;
}发布于 2022-09-14 13:06:33
我不明白为什么电影标题应该包含电影Id,在我看来,这是不好的做法,
我认为您需要更新SearchData并为Id添加一个单独的字段,并使用它进行筛选,这将使调试变得更加清晰和容易。
https://stackoverflow.com/questions/73717123
复制相似问题