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