实体框架使用谓词问题

时间:2012-02-17 20:20:38

标签: entity-framework predicatebuilder

我使用谓词来优化搜索选项,当我运行看起来相同的查询时,我得到两个不同的结果。

这个是正确的并返回预期结果:(硬编码字符串)

_predicate = PredicateBuilder.False<TBLDESIGN>();
_predicate = _predicate.Or(a => a.IS_APPROVED == true & a.ACTIVE == true & a.DATE_APPROVED > beginDate & (a.KEYWORDS.Contains("red") || a.NAME.Contains("red")));
_predicate = _predicate.Or(a => a.IS_APPROVED == true & a.ACTIVE == true & a.DATE_APPROVED > beginDate & (a.KEYWORDS.Contains("geos") || a.NAME.Contains("geos")));

这个只返回第二个谓词“geos”的结果。循环中的第一个(“红色”)被忽略。值“red”和“geos”在下面的循环中。

string searchTerm = "";
_predicate = PredicateBuilder.False<TBLDESIGN>();
for (int i = 0; i < search.Count(); i++)
{
    searchTerm = search[i].SearchTerm.Trim().ToString();
    _predicate = _predicate.Or(a => a.IS_APPROVED == true & a.ACTIVE == true & a.DATE_APPROVED > beginDate & (a.KEYWORDS.Contains(searchTerm) || a.NAME.Contains(searchTerm)));
}

如果这有任何不同,这是查询的其余部分。

            var results =
                        dbContext.TBLDESIGN
                        .Include(s => s.LKPRICE)
                        .Include(s => s.TBLDESIGNER)
                        .AsExpandable().Where(_predicate)
                        .OrderByDescending(s => s.DATE_APPROVED)
                        .Select(s => new
                        {
                            s.ACTIVE,
                            s.DATE_CREATED,
                            s.EXPORTED,
                            s.IMAGE_PATH,
                            DesignId = s.ID,
                            s.IS_APPROVED,
                            s.TBLDESIGNER.FIRST_NAME,
                            s.TBLDESIGNER.LAST_NAME,
                            s.TBLDESIGNER.ALIAS,
                            s.NAME,
                            s.LKPRICE.PRICE,
                            s.COMPLETED,
                            s.DATE_APPROVED,
                            DesignerId = s.TBLDESIGNER.ID,
                            s.VIEW_COUNT
                        }).ToList();

问题是如何让第二个谓词列表返回与第一个系列相同的结果。猜测当你传递字符串变量而不是硬编码值时,还有一些额外的事情要做。

谢谢, 比利

答案:

_predicate = PredicateBuilder.False<TBLDESIGN>();
for (int i = 0; i < search.Count(); i++)
{
    string searchTerm = search[i].SearchTerm.Trim().ToString();
    _predicate = _predicate.Or(a => a.IS_APPROVED == true & a.ACTIVE == true & a.DATE_APPROVED > beginDate & (a.KEYWORDS.Contains(searchTerm) || a.NAME.Contains(searchTerm)));
}

1 个答案:

答案 0 :(得分:2)

字符串声明需要在循环内部发生。

_predicate = PredicateBuilder.False<TBLDESIGN>();
    for (int i = 0; i < search.Count(); i++)
    {
        string searchTerm = search[i].SearchTerm.Trim().ToString();
        _predicate = _predicate.Or(a => a.IS_APPROVED == true & a.ACTIVE == true & a.DATE_APPROVED > beginDate & (a.KEYWORDS.Contains(searchTerm) || a.NAME.Contains(searchTerm)));
    }