Linq to Entities - 多列搜索
Linq to Entites - Multiple columns search
我有一个具有 3 个可搜索属性的实体 Car
:
Brand Model Code
----------- ---------------- -----------
Ferrari F40 X7844ADFS
Porsche 911 Turbo YSAD42313
而我有以下方法:
public IEnumerable<Car> SearchCar(string search)
{
IEnumerable<Car> result = Enumerable.Empty<Car>().AsEnumerable();
if (!string.IsNullOrEmpty(search))
{
var preResult = from A in _context.Cars
select new { TextField = A.Brand + " " + A.Model + A.Code,
car = A};
result = preResult.Where(x => x.TextField.ToLower().Contains(searchValue.ToLower())).Select(v => v.Car);
}
return result;
}
搜索示例:
- 保时捷 Turbo
- 法拉利
- YSAD42313
但是,此方法不适用于第一个(Porsche Turbo)。有什么方法可以让它在所有情况下都有效吗?
您需要拆分 search
变量中的不同词,然后单独搜索这些词。像这样:
var splitSearch = search.Split(' ');
result = preResult.Where(x => splitSearch.All(s => x.TextField.ToLower().Contains(s)))
.Select(v => v.Car);
IronMan84 的替代答案,我认为它会更有效,因为它不会在搜索之前连接所有字段。使用 TextField 和汽车创建匿名类型是不必要的,因为您只有 return 汽车。
您确定上下文中的对象称为 Persons 而不是 Cars 吗?
public IEnumerable<Car> SearchCar(string search)
{
if (string.IsNullOrEmpty(search)) return Enumerable.Empty<Car>().AsEnumerable();
var terms = search.ToLower().Split(' ');
return _context.Cars
.Where(x => terms.All(t =>
x.Brand.ToLower().Contains(t)
|| x.Model.ToLower().Contains(t)
|| x.Code.ToLower().Contains(t)));
}
另请注意,如果您使用不区分大小写的排序规则连接到数据库,则在所有情况下都可以省略 ToLower()。
我有一个具有 3 个可搜索属性的实体 Car
:
Brand Model Code
----------- ---------------- -----------
Ferrari F40 X7844ADFS
Porsche 911 Turbo YSAD42313
而我有以下方法:
public IEnumerable<Car> SearchCar(string search)
{
IEnumerable<Car> result = Enumerable.Empty<Car>().AsEnumerable();
if (!string.IsNullOrEmpty(search))
{
var preResult = from A in _context.Cars
select new { TextField = A.Brand + " " + A.Model + A.Code,
car = A};
result = preResult.Where(x => x.TextField.ToLower().Contains(searchValue.ToLower())).Select(v => v.Car);
}
return result;
}
搜索示例:
- 保时捷 Turbo
- 法拉利
- YSAD42313
但是,此方法不适用于第一个(Porsche Turbo)。有什么方法可以让它在所有情况下都有效吗?
您需要拆分 search
变量中的不同词,然后单独搜索这些词。像这样:
var splitSearch = search.Split(' ');
result = preResult.Where(x => splitSearch.All(s => x.TextField.ToLower().Contains(s)))
.Select(v => v.Car);
IronMan84 的替代答案,我认为它会更有效,因为它不会在搜索之前连接所有字段。使用 TextField 和汽车创建匿名类型是不必要的,因为您只有 return 汽车。 您确定上下文中的对象称为 Persons 而不是 Cars 吗?
public IEnumerable<Car> SearchCar(string search)
{
if (string.IsNullOrEmpty(search)) return Enumerable.Empty<Car>().AsEnumerable();
var terms = search.ToLower().Split(' ');
return _context.Cars
.Where(x => terms.All(t =>
x.Brand.ToLower().Contains(t)
|| x.Model.ToLower().Contains(t)
|| x.Code.ToLower().Contains(t)));
}
另请注意,如果您使用不区分大小写的排序规则连接到数据库,则在所有情况下都可以省略 ToLower()。