我正在使用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);
}
答案 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。