使用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;
}
试试这个:
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;
}
如何在客户端获得返回查询值以分配给网格视图绑定