MongoDb C # запросов, где предложение

1

Я работаю с MongoDb и использует класс PredicateBuilder для создания динамического предложения IN С#. Но исключение генерируется как:

[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
    Можете ли вы опубликовать код, где вы where_clause пожалуйста?
Теги:
linq

2 ответа

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.

  • 0
    коллекция имеет тип MongoCollection, она не поддерживает AsExpandable (),
  • 0
    Спасибо за помощь, но я уже пробовал это с помощью LinqKit
Показать ещё 2 комментария
0

Из-за Invoke он выглядит как ссылка на (ASP.search_aspx).txtid.Text был зафиксирован в закрытии, а не оценивает значение в это время. Могу ли я попросить вас явно оценить значение текстового поля в локальном, чтобы предотвратить случайный разбор парсера выражения:

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.
  • 0
    но то же самое работает со списком, т.е. когда коллекция имеет тип списка
  • 1
    А также «Текст» является свойством «txtid», а не функции
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню