MongoDb C#查询,where子句

时间:2014-06-12 10:49:49

标签: c# linq mongodb

我正在使用MongoDb,正在使用PredicateBuilder类来动态创建where子句IN C#。但异常生成为:

  

[System.ArgumentException] {"不支持where where子句:。"},

和动态生成的where子句是

{c => (True AndAlso Invoke(c => (c.ID == value(ASP.search_aspx).txtid.Text), c))} , 

使用的查询:

var result = collection.AsQueryable<USER>()
                      .Where(where_clause)
                      .Select(c => new { c.ID, c.COMPANYNAME, c.EMAIL 
                       }).Take(100).ToList();

集合的实例是MongoCollection

创建where_clause的代码:

var where_clause = PredicateBuilder.True<GLUSR_USR>();

//object result=0;
if ((txtGlid.Text).Trim() != "")
{
    where_clause = where_clause.And(c => c.GLUSR_USR_ID == txtGlid.Text);
}
if ((txtEmailid.Text).Trim() != "")
{
    where_clause = where_clause.And(c => c.GLUSR_USR_EMAIL == txtEmailid.Text);
}
if ((txtPhone.Text).Trim() != "")
{
    where_clause = where_clause.And(c => c.GLUSR_USR_PH_NUMBER == txtPhone.Text);
}
if ((txtMobile.Text).Trim() != "")
{
    where_clause = where_clause.And(c => c.GLUSR_USR_PH_MOBILE == txtMobile.Text);
}

2 个答案:

答案 0 :(得分:0)

由于Invoke,看起来在闭包中捕获了对(ASP.search_aspx).txtid.Text的引用,而不是在此时评估值。我是否可以要求您在本地显式评估文本框值,以防止Expression解析器出现混乱的可能性:

if (txtGlid.Text.Trim() != "")
{
    string s = txtGlid.Text;
    where_clause = where_clause.And(c => c.GLUSR_USR_ID == s);
}
<德尔> 它可能意味着你在动态构建器中添加了`where c.ID == txtid.Text`作为谓词,而不是`where c.ID == txtid.Text()`。传递字符串值应该生成更简单的谓词`(True AndAlso c.ID ==“someLiteralValue”)`,希望可以由`Linq`提供程序解析。

答案 1 :(得分:0)

尝试使用AsExpandable()

var result = collection.AsQueryable<USER>()
                       .AsExpandable()
                       .Where(where_clause)
                       .Select(c => new { c.ID, c.COMPANYNAME, c.EMAIL 
                       }).Take(100).ToList();

AsExpandable()位于LinqKit