我对 SQL Server、.NET 和 MVC 3/4 还很陌生,所以请耐心等待。我在 Linq-to-SQL 中创建了一个查询,它返回了我需要的数据,但不幸的是我的主机提供商不支持 DbGeography
类,特别是 DbGeography.PointFromText
方法Description here 。
因此,我创建了一个存储过程,并且第一部分工作正常,但我很难对数据进行汇总和平均。我想返回 SELECT
语句中按 Dish.DishId、Rest.RerstaurantId
分组的所有数据,并将 rev.Rating
转换为 AVG(rev.Rating)
并为每个组添加计数列。
以下是可以运行但不受支持的代码:
public static DbGeography CreatePoint(double latitude, double longitude)
{
var text = string.Format(CultureInfo.InvariantCulture.NumberFormat,
"POINT({0} {1})", longitude, latitude);
return DbGeography.PointFromText(text, 4326);
}
public static double MilesToMeters(double? miles)
{
if (miles == null)
return 0;
return miles.Value * 1609.344;
}
[HttpGet]
public JsonResult TopRated(double lat, double lng, double miles)
{
var source = CreatePoint(lat,lng);
var dist = MilesToMeters(miles);
var reviews = (from r in db.Reviews
where r.Restaurant.Location.Distance(source) <= dist
group r by new {
r.Dish,
r.Restaurant.Name,
r.Restaurant.Lat,
r.Restaurant.Lng
} into rg
select new {
Rating = rg.Average(r => r.Rating),
Count = rg.Count(),
Dish = rg.Key.Dish,
Restaurant = new {
Name = rg.Key.Name,
Lat = rg.Key.Lat,
Lng = rg.Key.Lng
}
});
reviews = reviews.OrderByDescending(r => r.Rating);
return Json(reviews, JsonRequestBehavior.AllowGet);
}
这里是需要修改的存储过程
CREATE PROCEDURE [dbo].[SearchNearbyReview]
@Lat decimal(9,6),
@Lng decimal(9,6),
@Dist decimal(9,6)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @pos geography;
SET @pos = geography::STPointFromText('POINT('
+ CONVERT(varchar(15), @Lng) + ' '
+ CONVERT(varchar(15), @Lat) + ')',
4326)
SELECT
rev.Rating,
rest.RestaurantId,
rest.Name AS RestaurantName,
rest.[Address],
rest.City,
rest.[State],
rest.Zip,
rest.Lat,
rest.Lng,
dish.DishId,
dish.Name AS DishName
FROM dbo.Reviews rev
INNER JOIN dbo.Restaurants rest
ON rev.Restaurant_RestaurantId = rest.RestaurantId
INNER JOIN dbo.Dishes dish
ON rev.Dish_DishId = dish.DishId
WHERE rest.Location.STDistance(@pos) <= (@Dist * 1609.334)
ORDER BY rest.RestaurantId, dish.DishId
END
最佳答案
select
t.AvgRating,
t.Count,
t.DishName,
t.DishId,
rest.RestaurantId,
rest.Name AS RestaurantName,
rest.[Address],
rest.City,
rest.[State],
rest.Zip,
rest.Lat,
rest.Lng
from dbo.Restaurants rest
join (select
avg(rev.Rating) as AvgRating,
count(1) as Count,
Restaurant_RestaurantId,
min(dish.Name) AS DishName,
DishId
from dbo.Dishes dish
join dbo.Reviews rev on rev.Dish_DishId = dish.DishId
group by Restaurant_RestaurantId, DishId
) as t
on t.Restaurant_RestaurantId = rest.RestaurantId
WHERE rest.Location.STDistance(@pos) <= (@Dist * 1609.334)
ORDER BY rest.RestaurantId, t.DishId
关于SQL 汇总和平均,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14418592/