LINQ for Entities (EF4 Code First) を使用していくつかのレコードを選択しようとしています。
次のような値を持つ AnimalType というフィールドを持つ Monitoring というテーブルがあります。
- 「ライオン、トラ、ヤギ」
- 「蛇、獅子、馬」
- 「ガラガラヘビ」
- "マウンテンライオン"
文字列配列 (animalValues) でいくつかの値を渡し、フィールド AnimalType の 1 つ以上の値が animalValues の 1 つ以上の値と一致する Monitorings テーブルから行を返したいと考えています。次のコードはほぼ期待どおりに機能しますが、私が取ったアプローチに重大な欠陥があることを発見しました。
public IQueryable<Monitoring> GetMonitoringList(string[] animalValues)
{
var result = from m in db.Monitorings
where animalValues.Any(c => m.AnimalType.Contains(c))
select m;
return result;
}
問題を説明するために、animalValues = { "Lion", "Tiger" } を渡すと、4 番目のレコード "Mountain Lion" に "Lion" という単語が含まれているため、3 つの行が選択されていることがわかります。マッチ。
これは私が望んでいたことではありません。「マウンテン ライオン」ではなく「ライオン」にのみ一致する「ライオン」が必要です。
別の例として、「Snake」を渡すと、「Rattlesnake」を含む行が取得されます。「Rattlesnake」に一致する「Snake」のように、その一部だけでなく、正確なコンマ区切り値に一致する一致を可能にする、より優れた LINQ コードを誰かが持っていることを願っています。