Linq to Sql中ElementAtOrDefault()的替代方案

时间:2015-03-19 13:22:36

标签: c# linq linq-to-sql

我想运行以下查询,但它表示不支持ElementAt。

List<Road> rdExist = (from u in db.Roads where (u.GPScoordinates.ElementAtOrDefault(0).Latitude == lattitude1 && u.GPScoordinates.ElementAtOrDefault(0).Longitude == longitude1) && (u.GPScoordinates.ElementAtOrDefault(1).Latitude == lattitude2 && u.GPScoordinates.ElementAtOrDefault(1).Longitude == longitude2) select u).ToList();

任何人都可以建议替代方案。我无法弄明白自己。 FirstOrDefault工作正常,但在查询中无法帮助我。

2 个答案:

答案 0 :(得分:1)

您可以使用Skip&amp; FirstOrDefault: -

List<Road> rdExist = (from u in db.Roads where
  (u.GPScoordinates.FirstOrDefault().Latitude == lattitude1 &&
   u.GPScoordinates.FirstOrDefault().Longitude == longitude1) &&
  (u.GPScoordinates.Skip(1).FirstOrDefault().Latitude == lattitude2 &&
   u.GPScoordinates.Skip(1).FirstOrDefault().Longitude == longitude2) select u).ToList();
LINQ-SQL不支持

ElementAtOrDefault。检查this

此外,使用此查询时请务必小心,因为如果是默认值,可能会导致Null reference exception。因此,在检索值之前,最好检查空值。

答案 1 :(得分:1)

尝试Skip(n).FirstOrDefault()代替ElementAtOrDefault(n)。这基本上意味着“在跳过n元素后获取第一个元素”,与“在位置n获取元素”大致相同,后者n0开始}:

List<Road> rdExist = (from u in db.Roads 
                      where (u.GPScoordinates
                              .FirstOrDefault().Latitude == lattitude1 && 
                             u.GPScoordinates
                              .FirstOrDefault().Longitude == longitude1) && 
                            (u.GPScoordinates
                              .Skip(1).FirstOrDefault().Latitude == lattitude2 && 
                             u.GPScoordinates
                              .Skip(1).FirstOrDefault().Longitude == longitude2) 
                      select u).ToList();