Не уверен, что это вполне возможно; Я нашел кое-что о создании выражений и предикатов, но до сих пор ничего не позволяет запускать произвольные запросы, не зная их заранее.Динамически генерировать предикат во время выполнения
В принципе, у меня есть коллекция объектов из большой базы данных SQL, и я создаю веб-страницу (ASP.NET MVC 4), чтобы позволить пользователю отображать и фильтровать эти объекты. Запросы, которые будут вводить пользователи, будут различаться по сложности. Самый простой и опрятный способ позволить им вводить эти запросы - это то, как плагин Visual Studio TFS позволяет вам искать рабочие элементы: таблицу условий, в которой вы можете продолжать добавлять строки. Вы выбираете «и» или «или» условие объединения, а затем выберите поле, введите значение, и выбрать, хотите ли вы то, что делает или не соответствует его:
1. show items where [Field] [is|is not] [value]
2. [and|or] [Field] [is|is not] [value]
3. [and|or] [Field] [is|is not] [value]
etc...
Что это самый простой способ, чтобы включить что во что-то LINQ-ish, что я могу вставить .ToList()
на конце? Единственное решение, которое я придумал до сих пор, связано с довольно большим и уродливым блоком переключения с футлярами для соответствия различным полям и привязке к .Where()
, но чтобы пользователь мог выбрать «или» для условия, тогда я в конечном итоге делать что-то вроде этого:
- Хотя условие AND:
- использовать большой переключатель, чтобы соответствовать поле
query = query.Where(ThisField == value);
- Когда вы нажмете условие, OR:
- добавить текущие результаты во временный список
- нового запроса от полного нефильтрованного списка
- использовать большой переключатель, чтобы соответствовать полю
query = fullList.Where(ThisField == value);
- , как и прежде
- При запуске из условий , добавьте текущий набор результатов во временный список, который вы использовали все время, и верните этот список.
Это кажется менее элегантным, чем хотелось бы.
Вы хотите запросить базу данных (используя что-то вроде LINQ to SQL) или список в памяти? – svick
База данных, желательно. Я могу загрузить нагрузку в память и работать над ними там, если это проще, но я бы предпочел не потому, что база данных довольно значительна. – anaximander