1

私はいくつかのLINQを実行しましたが、それはうまく機能しますが、私はこのタイプのコーディングのファンではありません。短縮したいのですが、方法がよくわかりません。

コードのこのセクションを短縮する方法を知っている人はいますか?以前に述語について聞いたことがありますが、それらを実装する方法がよくわかりませんか?

 List<Voucher> list = new List<Voucher>();    

if (String.IsNullOrEmpty(Search.SearchText) && Search.Status == 0)
{
    list = (from voucherslist in db.Vouchers
            //where voucherslist.Status != (int)VoucherStatus.Removed
            select voucherslist)                              
            .Take(100)
            .ToList();
}

if (!String.IsNullOrEmpty(Search.SearchText) && Search.Status ==0)
{
    list = (from voucherslist in db.Vouchers
            where voucherslist.Title.Contains(Search.SearchText)                                
            select voucherslist).Take(100).ToList();
}

if (String.IsNullOrEmpty(Search.SearchText) && Search.Status > 0)
{
    list = (from voucherslist in db.Vouchers
            where voucherslist.Status == Search.Status                                    
            select voucherslist).Take(100).ToList();
}

if (!String.IsNullOrEmpty(Search.SearchText) && Search.Status > 0)
{
    list = (from voucherslist in db.Vouchers
            where voucherslist.Status == Search.Status
            && voucherslist.Title.Contains(Search.SearchText)  
            select voucherslist).Take(100).ToList();
} 

// Convert
ret = VouchersConverter.Convert(list);

// Get Business Details
foreach (ENT_Voucher item in ret)
    item.BusinessDetails = this._businessesBLL.GetBusinessDataByID(item.BusinessID);

// Refine and sort
ret = ret.Where(x=>x.BusinessDetails.Accept == true)
            .OrderByDescending(x => x.Status.Equals(1))
            .ThenByDescending(x => x.StartDate).ToList();
4

2 に答える 2

4

繰り返しを削除するには、最初にリストを設定します。

list = (from voucherslist in db.Vouchers
        //where voucherslist.Status != (int)VoucherStatus.Removed
        select voucherslist);

次に、必要に応じてタイトル検索を追加します。

if (!String.IsNullOrEmpty(Search.SearchText))
{
    list = list.Where(x => x.Title.Contains(Search.SearchText));
} 

そしてステータス検索:

if (Search.Status > 0)
{
    list = list.Where(x => x.Status == Search.Status);
}

そして最後に、あなたの100を取り、それをリストにフラット化します。

list = list.Take(100).ToList();

覚えておくべきことは、これは.ToList()呼び出しまで実際にSQLクエリを作成して実行することはなく、実行されるSQLには、連結したすべてのフィルタリングが含まれるということです。

于 2012-08-09T12:37:12.483 に答える
4

あなたの現在の論理は私には少し壊れているように見えますが、私はあなたが望むと思います:

var query = db.Vouchers;
if (...)
{       
   query = query.Where(v => v.Title.Contains(Search.SearchText);
}
if (...)
{       
   query = query.Where(v => v.Status == Search.Status);
}
// etc

List<Voucher> list = query.Take(100).ToList();    

に複数の呼び出しを使用するとWhere、すべてのフィルターに「AND」が効果的に適用されます。

于 2012-08-09T12:35:27.993 に答える