我正在使用Simple.data,答案不在前面提到的技术中,但有助于理解这一点。所以忽略语法等
我用一个简单的查询来查询数据库;但基于一组条件,查询将发生变化。
例如:(非常简单,可能5-10个条件)
var result;
if(LoggedAtSelected)
{
// Condition 1 - Calls Logged after a certain date
result = db.Jobs.FindAll(db.Jobs.Logged_At >= startDate);
}
else
{
// Condition 2 - Calls Closed after a certain date
result = db.Jobs.FindAll(db.Jobs.Closed_At >= startDate && dd.Jobs.Closed_At <= endDate);
}
foreach(var JobRecord in result)
{
}
这是上面的理想代码,但遗憾的是,考虑到var的动态绑定和可变性质,这是不可能的。对于这种情况,最佳实践是什么?我唯一的想法是为每个条件写一个"var result=condition…",在if.else-if-.else中,在将其转换为该类型后将其分配给全局变量;然后在"foreach"中使用。听起来工作量很大。有什么想法吗?或者就是这样!!!?!!!
代替:
var result;
使用db.Jobs.FindAll
:返回的实际类型
IEnumerable<Job> result;
只有当编译器能够准确地知道要使用哪种类型(或者如何为您定义新类型)时,才能使用var。
在你的情况下,你可以用这样的类型来定义它
List<Job> result;
或者调用构造函数返回一个实例:
var result = new List<Job>;
(当然,您的查询将返回一个IEnumculable实例,而不是List,我只是用List作为示例,因为您无法实例化枚举。)
注意,如果if语句决定的是查询的过滤器,而不是查询本身,那么您可能需要在那里构建一个SimpleExpression,然后运行查询。例如
var whereCLause;
if(LoggedAtSelected)
{
// Condition 1 - Calls Logged after a certain date
whereClause = db.Jobs.Logged_At >= startDate;
}
else
{
// Condition 2 - Calls Closed after a certain date
whereClause = db.Jobs.Closed_At >= startDate && dd.Jobs.Closed_At <= endDate;
}
List<Job> results = db.Jobs.All.Where(whereClause);
foreach(Job record in results)
{
...
}