gpt4 book ai didi

c# - 基于 Linq 构建复杂的搜索过滤器

转载 作者:行者123 更新时间:2023-11-30 23:21:59 25 4
gpt4 key购买 nike

想知道是否有针对这种复杂情况的 linq 解决方案;例如,客户选择颜色:红色、尺寸:大号、类型:棉。如果我确定客户每次都会选择这些过滤器,我会这样做:

var shirts = ListOfShirts.Where(i=> i.Color.Contains("red") && Size.Contains("Large") && Type.Contains("Cotton"));

这是当前结构和一个从 View 中接受多个过滤器的操作方法:

:

public partial class Shirt {
public long ID { get; set; }
public string Color { get; set; }
public string Size { get; set; }
public string Type { get; set; }
}

public class SelectedFilter {
public string Name { get; set; } // Filter Menu Title
public string Value { get; set; }
}

Controller :

public ActionResult Filter(IList<SelectedFilter> selectedFilters) {
var model = new List<Shirt>();
Shirt ListOfShirts = db.GetAllShirts();
var groups = selectedFilters.GroupBy(i => i.Name);

foreach (var g in groups)
{
var GroupName = g.FirstOrDefault().name;
var GroupValues = g.Select(i => i.value).ToList();

if (g.FirstOrDefault().name == "Color")
{
model = ListOfShirts.Where(i => GroupValues.Contains(i.Color)).ToList();
}
else if (g.FirstOrDefault().name == "Size")
{
model = ListOfShirts.Where(i => GroupValues.Contains(i.Size)).ToList();
}
else if (g.FirstOrDefault().name == "Type")
{
model = ListOfShirts.Where(i => GroupValues.Contains(i.Type)).ToList();
}
}
}

最佳答案

一种(粗暴的)方法:

public ActionResult Filter(IList<SelectedFilter> selectedFilters) {
var model = new List<Shirt>();
IEnumerable<Shirt> ListOfShirts = db.GetAllShirts();

IEnumerable<Shirt> filteredListOfShirts = ListOfShirts
.Where(shirt => {
return (
(selectedFilters.Any(filter => filter.Name == "Color" && !string.IsNullOrWhiteSpace(filter.Value)) ? // is Color filter set?
selectedFilters.Any(filter =>
{
return (filter.Name == "Color" && shirt.Color == filter.Value);
}) : true)
&&
(selectedFilters.Any(filter => filter.Name == "Size" && !string.IsNullOrWhiteSpace(filter.Value)) ? // is Size filter set?
selectedFilters.Any(filter =>
{
return (filter.Name == "Size" && shirt.Size == filter.Value);
}) : true)
&&
(selectedFilters.Any(filter => filter.Name == "Type" && !string.IsNullOrWhiteSpace(filter.Value)) ? // is Type filter set?
selectedFilters.Any(filter =>
{
return (filter.Name == "Type" && shirt.Type == filter.Value);
}) : true)
);
});

model = filteredListOfShirts.ToList();

}

如果您有多个具有相同名称的过滤器值,这也应该有效

{Name="Color",Value="Red"},{Name="Color",Value="Blue"}

关于c# - 基于 Linq 构建复杂的搜索过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38984812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com