Проблема с использованием предложения Linq Any в Predicatebuilder
У меня проблема с предикатным строителем LinqKit. Я использовал его в прошлом для простых запросов, и он работал нормально, но сейчас я пытаюсь использовать его с предложением Any в выражении, и, похоже, он дает мне случайные результаты. Ниже приведен код, который я использую для построения заявления. Кто-нибудь может увидеть, что я делаю не так? Есть ли лучший и простой способ сделать то, что я хочу сделать. Я сейчас использую предикатный построитель, потому что я создаю очень сложный запрос, который может содержать вложенные предикаты и тому подобное, и я не видел другого простого способа сделать это. Я использую это с структурой лица.
if (cqv.ComplexQuery.IncludeOnAll)
{
Includepredicate = PredicateBuilder.True<Customer>();
}
else
{
Includepredicate = PredicateBuilder.False<Customer>();
}
inner = PredicateBuilder.True<Customer>();
if (a.Include == true || a.Exclude == true)
{
productinner = PredicateBuilder.True<CustomerProduct>();
if (a.VersiondID != 0)
{
productinner = productinner.And(o => o.ProductTypeID == a.ProductType.ID && o.VersionID == a.VersiondID);
inner = inner.And(o => o.Products.Any(productinner.Compile()));
}
else
{
productinner = productinner.And(o => o.ProductTypeID == a.ProductType.ID);
inner = inner.And(o => o.Products.Any(productinner.Compile()));
}
if (cqv.ComplexQuery.IncludeOnAll)
{
Includepredicate = Includepredicate.And(inner.Expand());
}
else
{
Includepredicate = Includepredicate.Or(inner.Expand());
}
}
IncludedCustomers = UoW.Customers.AsExpandable().Where(Includepredicate).ToList();
//This second list does the exact query the first one should be doing so I could compare results. The reuslts are totally different. Not only are there more results using predicatebuilder but they seem random
List<Customer> test = UoW.Customers.Where(o => o.Products.Any(s => s.ProductTypeID == 1)).ToList();
Я также не вижу простого способа отладить проблему с помощью построителя предикатов. Кто-нибудь знает быстрый способ определить SQL, который создается из этого запроса?
РЕДАКТИРОВАТЬ ----------------------------------------------
Поэтому я решил часть своей проблемы, но столкнулся с другой. проблема с предложением Any и случайными результатами была исправлена мной, установив целочисленную переменную с a.ProductType.ID и используя это значение в предложении. Как только я это сделал, я получил ожидаемые результаты. Теперь моя проблема заключается в том, что, хотя это работает нормально, когда выбран 1 продукт, если я выбираю naymore чем 1, вместо того, чтобы искать клиентов, у которых есть оба этих продукта, или любой из этих продуктов, результаты, которые я получаю, - это всегда просто клиент с последний продукт, который я положил в пункт для. Я поставлю мой обновленный код ниже
foreach (CustomerProductQueryProduct a in cqv.ComplexQuery.Products)
{
inner = PredicateBuilder.True<Customer>();
if (a.Include == true || a.Exclude == true)
{
value = a.ProductType.ID;
productinner = PredicateBuilder.True<CustomerProduct>();
if (a.VersiondID != 0)
{
productinner = productinner.And(s => s.ProductTypeID == value && s.VersionID == a.VersiondID);
inner = inner.And(o => o.Products.Any(productinner.Compile()));
}
else
{
productinner = productinner.And(s => s.ProductTypeID == value);
inner = inner.And(o => o.Products.Any(productinner.Compile()));
}
if (cqv.ComplexQuery.IncludeOnAll)
{
Includepredicate = Includepredicate.And(inner.Expand());
}
else
{
Includepredicate = Includepredicate.Or(inner.Expand());
}
}
}
IncludedCustomers = UoW.Customers.AsExpandable().Where(Includepredicate).ToList();
Разве PredicateBuilder не может обрабатывать несколько предложений Any?
1 ответ
Я наконец-то понял, что мне нужно сделать временную переменную внутри цикла for для хранения значения. Когда вы делаете это, он как-то знает, что значение должно быть разрешено немедленно, и предикаты работают.