1
私は述語を使用して検索オプションを絞り込み、同じクエリに見えるものを実行すると2つの異なる結果が得られます。述語を使用するエンティティフレームワーク
この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")));
この1つだけ第述語「GEOS」から結果を返します。ループ内の最初のもの( "red")は無視されます。値「赤」と「地理」は下のループの中にあります。
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();
質問は、最初のシリーズと同じ結果を返すように述語の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)));
}
これを実証しました。述語が構築されるたびに、searchTermの文字列宣言はループ内で発生する必要があります。答えは上です。 –