2

EFを使用してデータベースを検索するクエリを作成しています。TdsDbはEFコンテキストです。

string searchValue = "Widget";
TdsDb tdsDb = new TdsDb();
IQueryable<Counterparty> counterparties;

私は完全に一致することができます:

counterparties = tdsDb.Counterparties.Where(x => x.CounterpartyName == searchValue);

またはワイルドカード一致:

counterparties = tdsDb.Counterparties.Where(x => x.CounterpartyName.Contains(searchValue));

しかし、私は両方を実行できるようにしたい、つまり(疑似コード)

counterparties = tdsDb.Counterparties.Where(x => 
          if (searchValue.EndsWith("%")) 
                 {
                      if (searchValue.StartsWith("%"))
                          {x.CounterpartyName.Contains(searchValue)}
                      else 
                          {x.CounterpartyName.StartsWith(searchValue)}
                 }   
          else
                 {x => x.CounterpartyName == searchValue}
      );

今では明らかに、そのようなwhere句にifステートメントを入れることはできません。しかし、私はクエリを複製することもできません。ここに示されているように、それらは非常に唖然としています。本番クエリははるかに長いため、1つの句のみで異なる同じ長いクエリの複数のバージョンがあると、非常に不健全で保守しにくいように見えます。

何か案は?

4

1 に答える 1

1

三項演算子を使用できるはずです。

bool startsWithWildCard = searchValue.StartsWith("%");
bool endsWithWildCard = searchValue.EndsWith("%");

counterparties = tdsDb.Counterparties.Where(x => 
      endsWithWildCard
          ? (startsWithWildCard
              ?  x.CounterpartyName.Contains(searchValue)
              : (x.CounterpartyName.StartsWith(searchValue)))
          : (x.CounterpartyName == searchValue));

searchValue最初または最後にが付いているによるクエリ%が期待どおりに機能するかどうかをテストしましたか?とにかく生成されたSQL検索語の前にワイルドカードを追加/追加する%ためStartsWith、クエリする文字としてエスケープされる可能性があります。その場合、またはに渡す前に、を切り離す必要があります。Contains%%searchValueStartsWithContains

于 2012-09-20T17:35:14.057 に答える