Я использую библиотеку Microsoft Dynamic Linq (System.Linq.Dynamic) для создания некоторых запросов во время выполнения. Это отлично сработало для меня, но для одного конкретного сценария.
Упрощенный сценарий. Я пытаюсь запросить все претензии, которые имеют определенные теги, выбранные пользователем, и баланс которых больше некоторого числа.
static void Main(string[] args)
{
var claims = new List<Claim>();
claims.Add(new Claim { Balance = 100, Tags = new List<string> { "Blah", "Blah Blah" } });
claims.Add(new Claim { Balance = 500, Tags = new List<string> { "Dummy Tag", "Dummy tag 1" } });
// tags to be searched for
var tags = new List<string> { "New", "Blah" };
var parameters = new List<object>();
parameters.Add(tags);
var query = claims.AsQueryable().Where("Tags.Any(@0.Contains(outerIt)) AND Balance > 100", parameters.ToArray());
}
public class Claim
{
public decimal? Balance { get; set; }
public List<string> Tags { get; set; }
}
Этот запрос выдает ошибку:
Необработанное исключение типа «System.Linq.Dynamic.ParseException» произошло в System.Linq.Dynamic.dll. Дополнительная информация: в типе «String» не существует свойства или поля «Баланс».
Динамический синтаксический анализатор linq, похоже, пытается найти свойство Balance в теге, а не в объекте Claim.
- Я пытался поиграть с ключевыми словами outerIt, innerIt, It в Dynamic Linq, но ничего из этого не работает.
- Изменение последовательности работает, но для меня это не вариант, так как в реальном приложении фильтры, операторы и шаблоны будут динамическими (настраиваются конечным пользователем).
- Боксирование условий в скобках (), также не помогает.
- Обходной путь — создайте простое условие «содержит» для каждого выбранного тега, например. Tags.Contains("New") ИЛИ Tags.Contains("Blah") и т.д.. Но в реальном приложении это приводит к действительно сложному/плохому запросу для каждого условия и снижает производительность.
Я мог что-то упустить или это может быть ошибка в библиотеке.
Я был бы очень признателен, если бы кто-нибудь помог мне с этим.
@n
как левого значения, это может быть только правильное значение. - person Lei Yang   schedule 07.04.2017outerIt
является объектомClaim
, какList<string>
может его содержать? - person Lei Yang   schedule 07.04.2017