0

我正在尝试在我的 asp.net WebAPI 中构建一个方法,以根据传递给该方法的参数来获取数据。该方法用于对餐厅数据执行搜索。我有一个名为“type”的变量,它决定了执行的数据搜索的类型。第二个变量“关键字”是用户搜索的关键字。我的 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 库,然后您可以在 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 回答
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);
}

这会根据您的逻辑检查以不同方式构建您的表达式树,这将导致基于type.

我注意到在您的加入中,Cuisine似乎是一个实体,但在您的逻辑检查中,您尝试通过与Cuisine字符串进行比较来过滤,所以我认为存在一些断开连接。

于 2013-08-24T19:38:24.813 回答
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 回答