0

私の例では、名前が提供されていない場合に提供されるプロモーションコード名のプロモーション要素を取得し、利用可能なすべてのプロモーションを取得したいと考えています。

var result = from row in promoCodes.AsEnumerable() 
             where  (
                 !String.IsNullOrEmpty(fieldTitle) && 
                 !String.IsNullOrEmpty(filterValue) && 
                 row[fieldTitle].Equals(filterValue)
             ) || true
             select new PromoCodeInfoContainer
             {
                 BannerLink = row["BannerLink"] as string
                 ....
             };

条件が指定されていない場合、OR は選択に影響を与えないもの (|| true) になる SQL 手法に従うようにしました。linq ではこれは機能しませんでした。「fieldTitle」と「filterValue」が空でないにもかかわらず、常にすべてのエントリが返されます。誰かがそれを行う正しい方法を提案できますか?

4

2 に答える 2

2

まず、|| trueすべての行を常に返すため、問題を削除します。

これを行う良い方法の 1 つは構成です。これにより、値がある場合はすべての行に対してfieldTitle/をテストする必要がなくなり、fieldValue空白の場合は行ごとに何かを行う必要がなくなります。

var query = promoCodes.AsEnumerable();
if(!string.IsNullOrEmpty(fieldTitle) && !string.IsNullOrEmpty(fieldValue))
{
    query = from row in query
            where filterValue.Equals(row[fieldTitle])
            select row;
}
var result = from row in query
             select new PromoCodeInfoContainer {...}

Equalsまた、私たちが知っていることがnullではないことが左側にあるように逆にしたことに注意してください。ただし、データ型によっては、Equals(x,y)またはx == y望ましい場合があります。

于 2012-10-30T20:15:26.517 に答える
1
var result = from row in promoCodes.AsEnumerable() 
             where  String.IsNullOrEmpty(fieldTitle) ||                  
                    String.IsNullOrEmpty(filterValue) ||
                    row[fieldTitle].Equals(filterValue)  
             select new PromoCodeInfoContainer
             {
                 BannerLink = row["BannerLink"] as string
             };

いずれかfieldTitlefilterValuenull または空の場合、行フィルタリングは実行されません。

別のオプション(ここでは流暢なインターフェースの方が見栄えが良いと思います):

var query = promoCodes.AsEnumerable();

if (!String.IsNullOrEmpty(fieldTitle) && !String.IsNullOrEmpty(fieldValue))
    query = query.Where(row => row[fieldTitle].Equals(filterValue));

var result = query.Select(row => new PromoCodeInfoContainer { ... });
于 2012-10-30T20:15:49.567 に答える