1

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

4

3 回答 3

6

代替:

var result;

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

IEnumerable<Job> result;
于 2012-09-03T12:14:24.520 回答
0

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

在您的情况下,您可以使用类型定义它说

List<Job> result;

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

var result = new List<Job>;

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

于 2012-09-03T12:17:36.783 回答
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)
{
  ...
}
于 2012-10-16T13:10:33.063 回答