我正在使用C#VS2013 Express,并且想要一些帮助来编写LINQ语句。
每个MapCompany都有一个MapLocations列表,MapCompany和MapLocation都有一个userName字段。
这是我的代码:
IEnumerable<CanFindLocation.Models.MapCompany> mapCompanies = await db.mapCompanies.Where(mc => mc.userName.Equals(userName)).ToListAsync();
List<MapLocation> mapLocations = new List<MapLocation>();
foreach (var mapCompany in mapCompanies)
{
foreach (var mapLocation in mapCompany.mapLocations)
{
if (mapLocation.userName.Equals(userName))
{
mapLocations.Add(mapLocation);
}
}
}
我是LINQ的新手,想写一个LINQ语句,它将获得具有特定用户名的所有MapLocations。
我的上述代码有效,但我想帮助您将其编码为LINQ语句。
答案 0 :(得分:5)
如果我没弄错的话,
IEnumerable<CanFindLocation.Models.MapCompany> mapCompanies = await db.mapCompanies.Where(mc => mc.userName.Equals(userName)).ToListAsync();
var mapLocations = mapCompanies.SelectMany(mapCompany => mapCompany.mapLocations)
.Where(mapLocation => mapLocation.userName.Equals(username));
或Marcel B在评论,查询语法中建议:
var mapLocations = from mapCompany in mapCompanies
from mapLocation in mapCompany.mapCompanies
where mapLocation.userName.Equals(username)
select mapLocation;
当然,我会为这个案例以及其他任何我能做到这一点,但如果您通常在编写这样的LINQ表达式时遇到问题,那么您也可以使用yield return
模式。再说一次,我不会在这里,但我也会把它包括在内。
public IEnumerable<MapLocation> GetLocations(IEnumerable<CanFindLocation.Models.MapCompany> mapCompanies)
{
foreach (var mapCompany in mapCompanies)
{
foreach (var mapLocation in mapCompany.mapLocations)
{
if (mapLocation.userName.Equals(userName))
{
yield return mapLocation;
}
}
}
}
显然这不能回答你的问题,我的第一个代码块会这样做,但这仍然是一种更清洁,通常更好的方式来实现它的方式,因为它可以让你从延迟的性质中受益IEnumerable<T>
。