0

RESTAURANT、CUISINE、CITY、および STARRATING テーブルから情報を取得するレストランのリストを返しています。各レストランのリストとそれに関連付けられた都市と料理、および STARRATING テーブルの平均評価を取得したいと考えています。これまでのところ、これが私が持っているものです... よろしくお願いします。

   RestaurantsEntities db = new RestaurantsEntities();
public List<RESTAURANT> getRestaurantsWRating(string cuisineName, string cityName, string priceName, string ratingName)
{
    var cuisineID = db.CUISINEs.First(s => s.CUISINE_NAME == cuisineName).CUISINE_ID;
    List<RESTAURANT> result = (from RESTAURANT in db.RESTAURANTs.Include("CITY").Include("CUISINE").Include("STARRATING")
                               where RESTAURANT.CUISINE_ID == cuisineID
                               orderby RESTAURANT.REST_NAME ascending
                               select RESTAURANT).ToList();

    return result;
}
4

2 に答える 2

0

あなたが持っているものから、それはコレクションをRestaurant持っているように見えます。STARRATINGもしそうなら、これはあなたができることです:

from r in db.Restaurants
where r.CUISINE_ID == cuisineID
orderby r.REST_NAME ascending
select new { 
    Restaurant = r, 
    City = r.CITY,
    Cuisine = r.CUISINE,
    AvgRating = r.STARRATING.Average(rt => rt.Rating) 
}

これが正しくない場合は、クラスと関連付け(できればクラス図)に関する詳細情報を提供する必要があります。

(クラス名とプロパティ名に大文字を使用するBTWは従来型ではありません)。

于 2012-07-28T07:32:39.853 に答える
-1

まず、上記のコード ブロック全体を using ステートメントでラップします。

using(RestaurantEntities db = new RestaurantEntities())
{
    ...
}

これは、EF コンテキストのクリーンアップに役立ちます。

私が通常これを行う方法は、データベースを制御している場合、データベースにこの作業を行うビューを作成し、そのビューをエンティティ モデルに追加して、ビューにクエリを実行することです。これにより、プロセス全体が簡素化され、集約の作業がデータベースにオフロードされます。

データベースを制御できない場合、またはビュー手法を好まない場合は、以前と同じようにインクルード手法を使用してクエリを実行し、部分クラスを RESTAURANT に追加して (モデル ファーストを使用している場合)、 AverageRating プロパティを取得し、関連する行の関連する STARRATING セットごとに平均を手動で計算し、結果の値を追加されたプロパティに適用します。すべてのデータを元に戻したら、オブジェクトへの linq を介してこれを行うことができます。この手法は、1 つまたはいくつかの RESTAURANT インスタンスしか返さないという確信がない限り、より多くのデータが蓄積されるため、うまく拡張できません。次のようなものを使用できます。

//query data as you have done above...
foreach(RESTAURANT r in result)
{
    if(r.STARRATING.Count() > 0)
    {
        r.AverageRating = r.STARRATING.Average(rating => rating.Value); //.Value is your field name
    }
    else
    {
        r.AverageRating = 0; // or whatever default you prefer...
    }
}

お役に立てれば。

于 2012-07-27T02:47:54.253 に答える