此方法返回通用列表,但它有多个条件可供选择。 我只是写这个用if - else if -else if ....如果......那么多我的意思 有没有更短的方法来做到这一点?谢谢。
public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate)
{
var db = new requestsDBEntities();
var listPrn = new List<ProductReqNoDate>();
if (!string.IsNullOrEmpty(departmant))
{
return (from r in db.requests
where r.departmant== departmant
select new ProductReqNoDate
{
departmant= r.departmant,
reqNo = r.reqNo ,
reqDate = r.reqDate ,
prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault())
}).ToList();
}
if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate))
{
DateTime dtfirstDate = Convert.ToDateTime(firstDate);
DateTime dtlastDate = Convert.ToDateTime(lastDate);
return (from r in db.requests
where r.reqDate <= dtlastDate && r.reqDate >= dtfirstDate
select new ProductReqNoDate
{
departmant= r.departmant,
reqNo = r.reqNo ,
reqDate = r.reqDate,
prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault())
}).ToList();
}
}
答案 0 :(得分:6)
您可以将查询的核心内容如下:
var query = from r in db.requests
select new ProductReqNoDate
{
departmant= r.departmant,
reqNo = r.reqNo ,
reqDate = r.reqDate ,
prdctName= stringCutter((from p in db.products
where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault())
}
然后应用if then else
:
if (!string.IsNullOrEmpty(departmant))
return query.Where(r=>r.departmant== departmant).ToList();
if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate))
{
DateTime dtfirstDate = Convert.ToDateTime(firstDate);
DateTime dtlastDate = Convert.ToDateTime(lastDate);
return query.Where(r=> r.reqDate <= dtlastDate && r.reqDate >= dtfirstDate)
.ToList();
}
它不会减少if then else
,但会更加明智,会发生什么。
答案 1 :(得分:1)
1 *
你可以找到更好的解决方案,但我希望这有帮助(我的事)但我用它:你可以测试这个功能
List<ProductReqNoDate> yourList = GetRequestsQuery(string departmant, int reqStateID)
if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate))
{
yourdatagrid.Itemsource = yourList.where(a=> a.reqDate <= Datetime.parse(firstDate) & a.reqDate >= Datetime.parse(lastDate))
}
public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID)
{
var db = new requestsDBEntities();
var listPrn = new List<ProductReqNoDate>();
if (!string.IsNullOrEmpty(departmant))
{
return (from r in db.requests
where r.departmant== departmant
select new ProductReqNoDate
{
departmant= r.departmant,
reqNo = r.reqNo ,
reqDate = r.reqDate ,
prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault())
}).ToList();
}
}
您可以在第一个列表中应用任何条件,但不建议使用havy应用程序或数据库中的许多信息。
2 *
或者您可以制作第一个日期和最后一个日期;例如,如果没有设置日期,请将第一个日期= 01/01/1900和最后一个日期Datetime.Today,并始终在linq查询中传递您的日期
答案 2 :(得分:0)
这样的东西我没有编译和检查它但它应该给你一个线索。
public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate)
{
using(var db = new requestsDBEntities())
{
DateTime dtfirstDate =null;
DateTime.TryParse(firstDate,out dtfirstDate);
DateTime dtlastDate = null;
DateTime.TryParse(lastDate,out dtlastDate);
var result = (from r in db.requests
where
(r.departmant == departmant)
|| (r.reqDate <= dtlastDate.Value && r.reqDate >= dtfirstDate.Value)
select new ProductReqNoDate
{
departmant = r.departmant,
reqNo = r.reqNo ,
reqDate = r.reqDate ,
prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault())
}).ToList();
}
}
编辑:
如果你想在你的过滤器中使用非sql函数,那么在你的表上调用ToList()
var result = db.requests.ToList().Where(r => {
// do test for what you want
// so write a function to work out when you want to filter by
// name or date
return true;
}).Select( r => new ProductReqNoDate
{
departmant = r.departmant,
reqNo = r.reqNo ,
reqDate = r.reqDate ,
prdctName= stringCutter(db.products.Where(p=> p.reqNo == r.reqNo).Select(p=> p.prdctName).FirstOrDefault())
})
这个问题就是你要将整个表加载到内存中,如果你不经常更改它的值,如果它不是太大,那就很好。
另一种方法是将其编写为存储过程,这可能会让您的DBA满意。