我正在尝试将Linq查询作为字符串发送到要在where子句中使用的方法。由于IEnumerable不适用于此,我已将我的IEnumerable转换为IQueryable,但仍然会抛出错误。以下是代码:
public static void FilterData(string Query)
{
if((List<MemberMaintenanceData>)HttpContext.Current.Session["Allmembers"] != null)
{
//Get the IEnumerable object colection from session
var data = (List<MemberMaintenanceData>) HttpContext.Current.Session["Allmembers"];
//Convert it to IQueryable
IQueryable<MemberMaintenanceData> queryData = data.AsQueryable();
//This line doesn't compile!!
queryData = queryData.Where(Query);
HttpContext.Current.Session["Allmembers"] = queryData.AsEnumerable().ToList();
}
}
我打算将“a =&gt; a.AccountId == 1000”作为查询
传递答案 0 :(得分:3)
Microsoft提供了一个免费(和开源)库,用于将字符串解析为Lambda表达式,然后可以在Linq查询中使用。它还包含标准查询运算符的版本,例如采用字符串参数的Where()。你可以找到它described in Scott Guthries blog post on Dynamic Linq.
例如,你可以做这样的查询(改编自Scott guthrie链接的片段)
// imagine these have come from a drop down box or some other user input...
string thingToSelectBy = "City";
string citySelectedByUser = "London";
int minNumberOfOrders = 10;
string whereClause = String.Format("{0} = @0 and Orders.Count >= @1", thingToSelectBy);
var query = db.Customers
.Where(whereClause, citySelectedByUser, minNumberOfOrders)
.OrderBy("CompanyName")
.Select("new(CompanyName as Name, Phone");
thisw代码段中的Where子句显示了如何使用参数化字符串创建where子句,然后在运行时为参数动态注入值,例如,基于用户输入。这适用于任何类型的参数。
在您的示例中,where子句将是
whereClause = "AccountId = 1000";
所以实际上你会做类似
的事情var newFilteredQueryData = queryData.Where("AccountId = 1000");
该链接还包含可以下载源代码的位置以及描述动态查询API和表达式语言的综合文档。
答案 1 :(得分:1)
给出如下课程:
public class foo
{
public int AccountID {get;set;}
}
你应该可以这样做:
Expression<Func<foo, bool>> filter = f => f.AccountID == 1000;
然后将其作为您的查询传递。如果确实需要它作为字符串,你可以这样做:
filter.ToString();
答案 2 :(得分:0)
//通过使用这个库
使用 System.Linq.Dynamic.Core;
InventoryList = Repository.GetAll(); // 可查询
string filterString = "UnitPrice > 10 And Qty>100 OR Description.Contains("Dairy")";
varfilteredGenericList = InventoryList.Where(filterString);