使用asp.net WebAPI中的变量构造LINQ查询

本文关键字:LINQ 查询 变量 asp net WebAPI 使用 | 更新日期: 2023-09-27 18:28:58

我正试图在我的asp.net WebAPI中构建一个方法,以根据该方法传递的参数获取数据。该方法用于对餐厅数据进行搜索。我有一个名为"type"的变量,用于确定执行的数据搜索的类型。第二个变量"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;
    }

使用asp.net WebAPI中的变量构造LINQ查询

试试这个:

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;

我认为您需要查看一个动态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

如果你可以放弃全面的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的值生成不同的SQL查询。

我注意到,在您的联接中,Cuisine似乎是一个实体,但在您的逻辑检查中,您试图通过将Cuisine与字符串进行比较来进行筛选,因此我认为存在一些脱节。

                  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;
}

如何在客户端获得返回查询值以分配给网格视图绑定