2013-01-19 131 views
2

我對SQL Server,.NET和MVC 3/4相當新,所以請耐心等待。我在Linq-to-SQL中創建了一個查詢,返回了我需要的數據,但不幸的是,我的主機提供商不支持DbGeography類,特別是DbGeography.PointFromText方法Description hereSQL總結和平均

所以我創建了一個存儲過程,我得到了第一部分工作,但我很難總結和平均數據。我想返回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 

回答

2
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