我已经做了一些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();发布于 2012-08-09 20:37:12
要删除重复的内容,请先设置列表。
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-09 20:35:28
你目前的逻辑在我看来有点问题,但我怀疑你想要:
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“。
https://stackoverflow.com/questions/11883533
复制相似问题