Проблема с использованием предложения 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 для хранения значения. Когда вы делаете это, он как-то знает, что значение должно быть разрешено немедленно, и предикаты работают.

Другие вопросы по тегам