C# 使用LINQ排除数据

C# 使用LINQ排除数据,c#,linq,C#,Linq,我有一个LINQ查询,它返回大量路由的数据和坐标。当坐标量超过特定值时,我希望排除以下路线的坐标 这是我尝试这样做的方法,问题是当我尝试序列化对象时,JSON.net序列化超时 public static object returnFullSelectWithCoordinates(IQueryable<RouteQueryModel> r) { int totalCoordinateCount = 0; foreach (route

我有一个LINQ查询,它返回大量路由的数据和坐标。当坐标量超过特定值时,我希望排除以下路线的坐标

这是我尝试这样做的方法,问题是当我尝试序列化对象时,JSON.net序列化超时

    public static object returnFullSelectWithCoordinates(IQueryable<RouteQueryModel> r)
    {
        int totalCoordinateCount = 0;
        foreach (route x in r.Select(c => c.b))
        {
            if (totalCoordinateCount > DataValues.AmountOfCoordinates)
            {
                x.coordinates.Clear();
            }
            else
            {
                totalCoordinateCount += x.coordinates.Count;
                if (totalCoordinateCount > DataValues.AmountOfCoordinates)
                {
                    x.coordinates.Clear();
                }
            }
        }

        return r.Select(b => new
        {
            route_id = b.b.route_id,
            name = b.b.name,
            description = b.b.description,
            distance = b.b.distance,
            distance_to_route = (int)b.distance_to_from_me,
            departure_place = b.b.departure_place,
            arrival_place = b.b.arrival_place,
            owner = b.b.user.username,
            average_rating = b.avg_rating,
            is_favorite = b.is_favorite,
            date = b.b.date,
            attributes = b.b.route_attributes.Select(c => c.route_attribute_types.attribute_name),
            coordinates = b.b.coordinates.Select(c => new coordinateToSend { sequence = c.sequence, lat = c.position.Latitude, lon = c.position.Longitude })
        });
    }
public static object returnFullSelectWithCoordinates(IQueryable r)
{
int totalCoordinateCount=0;
foreach(路径x在r.Select中(c=>c.b))
{
if(TotalCoordinatedCount>DataValues.AmountOfCoordinates)
{
x、 坐标。清除();
}
其他的
{
totalCoordinateCount+=x.coordinates.Count;
if(TotalCoordinatedCount>DataValues.AmountOfCoordinates)
{
x、 坐标。清除();
}
}
}
返回r.Select(b=>new
{
路线id=b.b.路线id,
name=b.b.name,
描述=b.b.描述,
距离=b.b.距离,
距离到路线=(int)b.距离到我的距离,
出发地点=b.b.出发地点,
到达地点=b.b.到达地点,
所有者=b.b.user.username,
平均额定值=b.平均额定值,
是你最喜欢的,
日期=b.b.日期,
属性=b.b.route\u属性。选择(c=>c.route\u属性\u类型。属性\u名称),
坐标=b.b.coordinates.选择(c=>newcoordinateSend{sequence=c.sequence,lat=c.position.Latitude,lon=c.position.Longitude})
});
}

正如弗拉基米尔·弗罗洛夫(Vladimir Frolov)所指出的,您对结果进行了两次枚举。这是浪费时间和资源,但最糟糕的是,第二次重新开始时,第一次迭代的更改丢失了

因此,我想扭转这种局面:首先获取您需要的数据,这样您就可以从缩小SQL查询范围的投影中获益。然后更改需要更改的内容:

public static object returnFullSelectWithCoordinates(IQueryable<RouteQueryModel> r)
{
    var results = r.Select(b => new
    {
        route_id = b.b.route_id,
        name = b.b.name,
        description = b.b.description,
        distance = b.b.distance,
        distance_to_route = (int)b.distance_to_from_me,
        departure_place = b.b.departure_place,
        arrival_place = b.b.arrival_place,
        owner = b.b.user.username,
        average_rating = b.avg_rating,
        is_favorite = b.is_favorite,
        date = b.b.date,
        attributes = b.b.route_attributes
                     .Select(c => c.route_attribute_types.attribute_name),
        coordinates = b.b.coordinates.Select(c => new coordinateToSend 
                                                  { sequence = c.sequence,
                                                    lat = c.position.Latitude, 
                                                    lon = c.position.Longitude
                                                  })
    }).ToList(); // ToList !!

    int totalCoordinateCount = 0;
    foreach (var x in results)
    {
        if (totalCoordinateCount + x.coordinates.Count
                                 > DataValues.AmountOfCoordinates)
        {
            x.coordinates.Clear();
        }
        else
        {
            totalCoordinateCount += x.coordinates.Count;
        }
    }

    return results;
}
public static object returnFullSelectWithCoordinates(IQueryable r)
{
var results=r.Select(b=>new
{
路线id=b.b.路线id,
name=b.b.name,
描述=b.b.描述,
距离=b.b.距离,
距离到路线=(int)b.距离到我的距离,
出发地点=b.b.出发地点,
到达地点=b.b.到达地点,
所有者=b.b.user.username,
平均额定值=b.平均额定值,
是你最喜欢的,
日期=b.b.日期,
属性=b.b.route_属性
.Select(c=>c.route\u attribute\u types.attribute\u name),
坐标=b.b.coordinates.选择(c=>newcoordinateSend
{sequence=c.sequence,
纬度=c位置纬度,
lon=c.position.Longitude
})
}).ToList();//ToList!!
int totalCoordinateCount=0;
foreach(结果中的var x)
{
如果(totalCoordinateCount+x.coordinates.Count
>DataValues.AmountOfCoordinates)
{
x、 坐标。清除();
}
其他的
{
totalCoordinateCount+=x.coordinates.Count;
}
}
返回结果;
}

您正在使用匿名类型并返回可能导致某些问题的对象。考虑另一个模型,然后返回<代码> iQueLabe<代码>,而不是<代码>匿名对象< /代码>。“超时”是什么意思?超时过期了。操作完成前超时或服务器未响应您有2个
r.Select(
,即可能对查询进行多次求值。请尝试保存一次,如
r.ToArray()
然后使用数组。作为SQL例外?听起来您的数据库执行查询花费的时间太长-与JSon无关