“var”的最佳实践(算法帮助)

时间:2012-09-03 12:12:33

标签: c# dynamic var simple.data

我正在使用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”中使用它。听起来很多工作。有任何想法吗?或者就是这样!!!?!!!

3 个答案:

答案 0 :(得分:6)

而不是:

var result;

使用db.Jobs.FindAll返回的实际类型:

IEnumerable<Job> result;

答案 1 :(得分:0)

如果编译器可以准确知道要使用哪种类型(或如何为您定义新类型),则只能使用var。

在您的情况下,您可以使用类型说明

来定义它
List<Job> result;

或调用构造函数返回一个实例:

var result = new List<Job>;

(当然你的查询将返回一个IEnumarable实例而不是List,我只是使用List作为一个例子,因为你无法实例化一个枚举。)

答案 2 :(得分:0)

正如请注意,由于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)
{
  ...
}