2012-02-17 30 views
1

我正在使用謂詞來優化搜索選項,並在運行看起來是相同的查詢時得到兩個不同的結果。使用謂詞的實體框架問題

這是正確的,並返回預期的結果:(硬編碼字符串)

_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))); 
} 
+0

想通了。每次構建謂詞時,searchTerm的字符串聲明都需要在循環內部產生。答案在上面。 – 2012-02-17 21:42:16

回答

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))); 
    }