如何做到这两个sql请求合一



我有这两个请求

if (prix1=="" && prixe2=="") {
    ArrayList al = new ArrayList();
    al.AddRange((from prodname in pms_data_.produit
        where prodname.desgnation == Desg || 
              prodname.labo.labo1 == Labo || 
              prodname.rayon.rayon1 == Ra || 
              prodname.Formf.form == FORM || 
              prodname.code == CODBARRE 
        select prodname).ToList());
    return al;
}
else
{
    int p1 = Convert.ToInt32(prix1);
    int p2 = Convert.ToInt32(prixe2);
    ArrayList al = new ArrayList();
    al.AddRange((from prodname in pms_data_.produit
        where prodname.desgnation == Desg || 
              prodname.labo.labo1 == Labo || 
              prodname.rayon.rayon1 == Ra || 
              prodname.Formf.form == FORM || 
              prodname.code == CODBARRE || 
              prodname.ppv >=p1 && prodname.ppv <=p2
        select prodname).ToList());
    return al;

所以条件是,如果价格为空,我需要从数据库导入数据,如果价格不为空,我们需要从数据库大陆导入数据。

我如何用一个请求而不是两个请求来做到这一点?

Biscuits在他的评论中有一个好主意:有条件地应用Where子句。这将只产生一个DB查询,减少重复代码,并保持代码清晰。

var query = from prodname in pms_data_.produit
            where prodname.desgnation == Desg || 
                  prodname.labo.labo1 == Labo || 
                  prodname.rayon.rayon1 == Ra || 
                  prodname.Formf.form == FORM || 
                  prodname.code == CODBARRE 
            select prodname;
if (!string.IsNullOrEmpty(prix1) && !string.IsNullOrEmpty(prixe2)) {
    int p1 = Convert.ToInt32(prix1);
    int p2 = Convert.ToInt32(prixe2);
    query = query.Where(prodname => prodname.ppv >= p1 && prodname.ppv <= p2);
}
return new ArrayList(query.ToList());

我将其切换为使用IsNullOrEmpty,这更有可能是预期的行为。

如果可能的话,您应该放弃使用过时的ArrayList类,开始使用List<T>,例如List<Produit>或通过接口IList<Produit>ArrayList上缺少泛型使得它更难使用,而且它比新选项慢。然后您的返回代码变为

return query.ToList();

最新更新