После чистки интернета мне не удалось найти решение, которое я мог бы заставить работать. Я пытаюсь использовать динамический linq, чтобы позволить пользователю создать пользовательский запрос из формы Windows. Чтобы содержать каждое предложение where, я построил объект с именем WhereClause:
public class WhereClause
{
public int id { get; set; }
public string ColumnName { get; set; }
public string Operator { get; set; }
public string OperatorSymbol { get; set; }
public object Value { get; set; }
public string AndOr { get; set; }
public string AndOrSymbol { get; set; }
}
Большинство говорит само за себя, но различие между символом оператора и символом оператора состоит в том, что оператор будет хранить «равно» или «больше, чем», где символ оператора будет «==» и «>» соответственно. AndOR работает аналогичным образом.
Затем, когда пользователь создает предложения where, создается новый объект WhereClause, который добавляется в List<WhereClause>
Когда приходит время выполнения запроса, я использую Entity Framework и Linq для построения запроса.
Я хотел бы сделать что-то вроде:
List<WhereClause> wheres; //populated via parameter in the encapsulating method.
DataContext db = new DataContext();
var query = from d in db.Database select d;
string whereClause = "";
foreach(WhereClause where in wheres){
whereClause = whereClause + String.Format(" {0} {1} {2} {3}", where.ColumnName, where.OperatorSymbol, where.Value, where.AndOrSymbol);
query.Where(whereClause);
}
Я пытался всеми способами построить предложения where, включая where(predicate, params)
и форматирование предиката с использованием "@1"
, но не нашел правильного способа сделать это.
Вот как выглядит построитель запросов для контекста.
Так что теперь я обращаюсь к вам, ребята за помощью ..