0

フォームにオプションのチェックボックスを備えた説明フィールドがあるとします。チェックボックスは、ルックアップを実行するときに検索するフィールドを表します。現在、where句の一意のバージョンを呼び出すルックアップのマトリックスがあります。動作しますが、少し臭いがします。

これが抜粋です

    // Look for part numbers decide how many fields to search and use that one.
    // 0 0 X
    if (!PartOpt[0] && !PartOpt[1] && PartOpt[2])
    {
     query = query.Where(p => (p.PartNumAlt2.Contains(partSearchRec.inventory.PartNum)));
    }
    // 0 X 0
    if (!PartOpt[0] && PartOpt[1] && !PartOpt[2])
    { 
      query = query.Where(p => (p.PartNumAlt.Contains(partSearchRec.inventory.PartNum)));
    }
    // 0 X X
    if (!PartOpt[0] && PartOpt[1] && PartOpt[2])
    {
      query = query.Where(p => (p.PartNumAlt.Contains(partSearchRec.inventory.PartNum)
        || p.PartNumAlt2.Contains(partSearchRec.inventory.PartNum)));
    }
    // X 0 0
    if (PartOpt[0] && !PartOpt[1] && !PartOpt[2])
    {
      query = query.Where(p => (p.PartNum.Contains(partSearchRec.inventory.PartNum)));
    }
     . . .

これはしばらく続き、コーディングエラーが発生しやすいようです。いずれの場合も、選択したフィールドのいずれかで同じ情報を探しています。SQLでこれを行っている場合は、必要に応じてWHERE句を作成するだけで済みます。

4

1 に答える 1

0

もう一度、私は答えへの道をゴムで覆った。質問を捨てるのではなく、これが私が思いついたものです。効率的ですか?

if (partSearchRec.optPartNum || partSearchRec.optAltPartNum1 || partSearchRec.optAltPartNum2)
{
  query = query.Where(p => (
       (partSearchRec.optPartNum && p.PartNum.Contains(partSearchRec.inventory.PartNum))
    || (partSearchRec.optAltPartNum1 && p.PartNumAlt.Contains(partSearchRec.inventory.PartNum))
    || (partSearchRec.optAltPartNum2 && p.PartNumAlt2.Contains(partSearchRec.inventory.PartNum))));
}

基本的に、チェックボックスのいずれかが設定されている場合は、クエリを実行します。チェックボックスがオンになっている場合にのみ、クエリの各行が処理されます。ANDの左側がfalseの場合、右側は処理されません。

これは、Delphiのwithステートメントが便利な時代です。また、LINQステートメント内で配列を使用できないことも学びました。

于 2012-08-23T11:07:30.000 に答える