我有一个清单&列表
我想从dbCars对象中获取Car的列表,条件是 名称,标题,注释属性包含target_terms数组中的任何值[请注意我不是要查找数组包含对象属性,但我正在尝试反向]&动态分配结果
我尝试了下面的代码[将检查数组是否包含任何属性]
List<Car> dbCars;//Values from Db
List<string> target_terms=new List<string> {"diesel","mechanic"};
var ranked_result = (from carItem in dbContext.Cars
select new
{
carItem,
Rank = target_terms.Contains(carItem.Title) ? 1 :
target_terms.Contains(carItem.Name) ? 2 :
target_terms.Contains(carItem.Comment) ? 3 :
0
}).OrderBy(i => i.Rank);
//exclude results with no match (rank=0 ) and get a Distinct set of images
List<Car> _searchResult = (from item in ranked_result
where item.Rank != 0
select item.carItem).Distinct().ToList();
如何编写相同的代码来执行反向操作,即检查Car属性是否包含target_terms中的任何单词
例如,如果我正在寻找柴油,如果我有2辆名为“Swift Diesel car”“Alto Diesel car”的车,它应该返回2个结果 即我的属性标题或名称或注释包含单词“diesel”
答案 0 :(得分:3)
你可以这样做,
var _searchResult = dbCars.Cars.Where(carItem => target_terms.Any(x => carItem.Title.Contains(x) ||
carItem.Name.Contains(x) ||
carItem.Comment.Contains(x)));
编辑:
var _searchResult = dbCars.Cars.Where(carItem => target_terms.Any(x => carItem.Title.Contains(x) ||
carItem.Name.Contains(x) ||
carItem.Comment.Contains(x)))
.Select(carItem => new
{
carItem,
Rank = target_terms.Any(x => carItem.Title.Contains(x)) ? 1 :
target_terms.Any(x => carItem.Name.Contains(x)) ? 2 :
target_terms.Any(x => carItem.Comment.Contains(x)) ? 3 : 0
})
.OrderBy(carItem => carItem.Rank);
希望这会有所帮助......
答案 1 :(得分:0)
如果您想查找标题,名称或评论中包含target_terms中任何单词的汽车,请使用.Where
查询:
var result = dbContext.Cars.Where(c =>
target_terms.Any(t =>
c.Title.Contains(t) ||
c.Name.Contains(t)) ||
c.Comment.Contains(t)));
不要忘记.Contains
区分大小写;
如果您只需要匹配某个特定单词,那就非常相似:
var match_word = "diesel";
var result = dbContext.Cars.Where(c =>
c.Title.Contains(match_word) ||
c.Name.Contains(match_word)) ||
c.Comment.Contains(match_word)));
在这种情况下,目前还不清楚这个词与target_terms列表的关系。
编辑:修复了检查包含的查询,而不是相等。
答案 2 :(得分:0)
我没试过,但应该这样做:
var filteredCars = dbContext.Cars.Where(c =>
target_terms.Any(tt => c.Title.Contains(tt)) ||
target_terms.Any(tt => c.Name.Contains(tt)) ||
target_terms.Any(tt => c.Comment.Contains(tt)));
因为对于其中一个人来说这是真的,所以你不必担心选择不同的价值。