我有一个表单,它向控制器发送一个参数列表。对于我的其他查询,我发送表单数据:
public ActionResult Index(string[] category)
将每个打开到一个hashset:
if ((category != null) && (category.Count() > 0))
{
foreach (var item in category)
{
categoryHashset.Add(item);
}
}
我用过
categoryHashset.Contains(object.Category)
在where语句中键入设置。这对我的大多数查询都很有用,因为大多数表都有一个类别映射到一个组。因此,一个组可能会多次出现在表中,但可以链接到许多类别。所以我会这样做:
var groupCount = studyGroup
.GroupBy(s => s.ID)
.Select(g => new { ID = g.Key, Count = g.Count() });
foreach (var checkCount in groupCount) //check or filter as well
{
if (checkCount.Count == category.Count())
{
otherHashset.Add(checkCount.ID.ToString());
}
}
但是,在这种特定情况下,每个类别都在表中的一列中,由管道(|)分隔。如果用户检查多个类别,我只想撤回列中包含所有这些类别的组。换句话说,如果我检查“猫”和“狗”,它应该只会退回:
Group Category
Star cat|dog|bird
Night cat|bird
Sky cat|dog
上表示例中的星空。
我如何处理管道并获得正确的结果?
答案 0 :(得分:0)
您可以在分组前过滤studyGroups
以仅获取其类别(按“|”拆分的类别)包含所有categoryHashSet
的内容,如下所示:
var groupCount = studyGroup
.Where(group =>
categoryHashset.All(c => group.Category.Contains("|" + c + "|")
||
group.Category.StartsWith(c + "|")
||
group.Category.EndsWith("|" + c)
||
group.Category.Equals(c))
.GroupBy(s => s.ID)
.Select(g => new { ID = g.Key, Count = g.Count() });
请注意,您不能使用group.Category.Split()
,因为linq不支持实体,即使在这种情况下似乎更合乎逻辑。