0

メソッドで渡された引数に基づいてデータを取得するために、asp.net WebAPI でメソッドを構築しようとしています。このメソッドは、レストラン データの検索を実行するために使用されます。実行されるデータ検索のタイプ​​を決定する「type」という変数があります。2 番目の変数「keyword」は、ユーザーが検索したキーワードです。LINQ クエリの WHERE 条件は型に依存し、動的にする必要があるため、LINQ クエリの外部で別の変数を使用して条件を定義しました。この変数を LINQ クエリの WHERE ステートメントに割り当てようとしましたが、うまくいかないようです。誰かがそれを手伝ってくれますか?私はこれで数日間立ち往生しています

public IQueryable<RestaurantView> GetRestaurantsForSearch(string keyword, int type, string location)
    {
        //
        var condition = "";
        if(type == 1)
        {
           condition = "x.RestaurantName.Contains(keyword)";
        } else if(type == 2){
            condition = "x.Cuisine.Equals(keyword)"; 
        }
        else {
            condition = "x.Rating.Equals(keyword)";
        }

        var query = from x in db.Restaurants
                    join y in db.Cuisine on x.RestaurantCuisine equals y.CuisineID
                    where condition
                    select new RestaurantView
                    {
                        RestaurantID = x.RestaurantID,
                        RestaurantName = x.RestaurantName,
                        RestaurantCuisine = y.CuisineName,
                        RestaurantDecription = x.RestaurantDecription
                    };


        return query;
    }
4

4 に答える 4

3

これを試して:

Predicate<Restaurant> pred;
if (type == 1) pred = x => x.RestaurantName.Contains(keyword);
else if (type == 2) pred = x => x.Cuisine.Equals(keyword);
else pred = x => x.Rating.Equals(keyword);

var query = from x in db.Restaurants
            join y in db.Cuisine on x.RestaurantCuisine equals y.CuisineID
            where pred(x)

            select new RestaurantView
            {
                RestaurantID = x.RestaurantID,
                RestaurantName = x.RestaurantName,
                RestaurantCuisine = y.CuisineName,
                RestaurantDecription = x.RestaurantDecription
            };
return query;
于 2013-08-24T18:48:09.280 に答える
1

拡張メソッドの構文を優先して包括的な LINQ クエリを削除しても問題ない場合は、非常に簡単です (私は VS のないネットブックを使用しているため、これはテストされていないことをお詫びしますが、アイデアを提供する必要があります)。

var query = db.Restaurants
            .Include("Cuisine")

if(type == 1)
{
    query= query.Where(x => x.RestaurantName.Contains(keyword));
} 
else if(type == 2)
{
    query = query.Where(x => x.Cuisine == keyword); 
}
else {
    query = query.Where(x => x.Rating == keyword);
}

これにより、ロジック チェックに基づいて異なる方法で式ツリーが構築され、 の値に基づいて異なる SQL クエリが生成されますtype

あなたの結合でCuisineはエンティティのように見えますが、ロジックチェックではCuisine、文字列と比較してフィルタリングしようとしているため、切断があると思います。

于 2013-08-24T19:38:24.813 に答える
1

動的なlinqライブラリを見る必要があると思います。そうすれば、linq内で文字列ステートメントを実行できます

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

または、直接クエリを実行できます

http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.executequery.aspx

于 2013-08-24T18:46:22.403 に答える
0
                  var query = from x in db.Restaurants
                join y in db.Cuisine on x.RestaurantCuisine equals  y.CuisineID
                where condition
                select new RestaurantView
                {
                    RestaurantID = x.RestaurantID,
                    RestaurantName = x.RestaurantName,
                    RestaurantCuisine = y.CuisineName,
                    RestaurantDecription = x.RestaurantDecription
                };


    return query;
}

クライアント側で返されるクエリ値を取得して、グリッド ビュー バインディングに割り当てる方法

于 2015-03-09T04:28:40.047 に答える