我正在使用jqueryui自动完成功能来帮助用户选择项目。我无法从对象的子集合中选择正确的项目 对象结构(简化)是
public class TargetType
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<SubCategory> SubCategories { get; set; }
public TargetType()
{
SubCategories = new HashSet<SubCategory>();
}
}
public class SubCategory
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<SubTargetType> SubTargetTypes { get; set; }
public SubCategory()
{
SubTargetTypes = new HashSet<SubTargetType>();
}
}
目前我正在使用嵌套的foreach循环这样做,但有更好的方法吗? 目前的代码:
List<SubTargetResponse> result = new List<SubTargetResponse>();
foreach (SubCategory sc in myTargetType.SubCategories)
{
foreach (SubTargetType stt in sc.SubTargetTypes)
{
if (stt.Name.ToLower().Contains(type.ToLower()))
{
result.Add(new SubTargetResponse {
Id = stt.Id,
CategoryId = sc.Id,
Name = stt.Name });
}
}
}
答案 0 :(得分:2)
你可以这样使用Linq
var result = myTargetType.SubCategories
.SelectMany(sc => sc.SubTargetTypes)
.Where(stt => stt.Name.ToLower().Contains(type.ToLower()))
.Select(stt => new SubTargetResponse {
Id = stt.Id,
CategoryId = sc.Id,
Name = stt.Name });
以上查询不起作用。以下内容应该有效,但我不建议这样做,因为它不会更快或更易读。
var result = myTargetType.SubCategories
.Select(sc => new Tuple<int, IEnumerable<SubTargetType>>
(sc.Id,
sc.SubTargetTypes.Where(stt => stt.Name.ToLower().Contains(type.ToLower()))))
.SelectMany(tpl => tpl.Item2.Select(stt => new SubTargetResponse {
Id = stt.Id,
CategoryId = tpl.Item1,
Name = stt.Name }));
答案 1 :(得分:0)
实际上有两个不同的问题。
LINQ选择包含字符串
的所有子集合的所有项目
解决方案:
(A)LINQ语法:
var result =
(from sc in myTargetType.SubCategories
from stt in sc.SubTargetTypes.Where(t => t.Name.ToLower().Contains(type.ToLower()))
select new SubTargetResponse
{
Id = stt.Id,
CategoryId = sc.Id,
Name = stt.Name
})
.ToList();
(B)方法语法:
var result =
myTargetType.SubCategories.SelectMany(
sc => sc.SubTargetTypes.Where(stt => stt.Name.ToLower().Contains(type.ToLower())),
(sc, stt) => new SubTargetResponse
{
Id = stt.Id,
CategoryId = sc.Id,
Name = stt.Name
})
.ToList();
目前我正在使用嵌套的foreach循环执行此操作,但有更好的方法吗?
嗯,这取决于你的意思&#34;更好&#34;。将您的代码与LINQ解决方案进行比较并回答问题。我个人并不认为LINQ在这种情况下更好(除了没有花括号和不同的缩进,但是很多隐藏的垃圾),以及在this answer中对第二个LINQ版本说些什么 - 如果那样&#39; s&#34;更好&#34;比你的代码,我不知道我们要去哪里。