如何在linq where子句中使用字符串?

时间:2012-03-12 15:03:58

标签: linq dynamic

我正在尝试将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”作为查询

传递

3 个答案:

答案 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);