2013-12-10 60 views
0

我想知道是否可以选择我想这取决于其他列的值进行比较datetime值哪一列,例如:根据列的值更改选择条件

我的模型看起来是这样的:

public class ServicosFinanceiro 
{ 
    [Key] 
    public int IdservFin { get; set; } 
    public int? ParcelaAtual { get; set; } 
    public DateTime? DataVencto1 { get; set; } 
    public DateTime? DataVencto2 { get; set; } 
    public DateTime? DataVencto3 { get; set; } 
    public DateTime? DataVencto4 { get; set; } 
} 

我想根据ParcelaAtual值,使用linq to sql选择DataVencto1或DataVencto2或DataVencto3或DataVencto4的日期时间范围内的行。

如果ParcelaAtual = 1,我需要比较DataVencto1列的日期。 如果ParcelaAtual = 2我需要比较DataVencto2列的日期等。

当前我选择所有行并执行foreach检查ParcelaAtual值是什么,根据它我选择比较日期各自的DataVencto列的范围并将其添加到另一个模型对象。

是否有可能在使用linq to sql的select语句上实现该功能?

回答

0

就做这样的事情

from s in ServicosFinanceiro 
where (s.ParcelaAtual == 1 && s.DataVencto1 >= start && s.DataVencto1 <= end) || 
     (s.ParcelaAtual == 2 && s.DataVencto2 >= start && s.DataVencto2 <= end) || 
     (s.ParcelaAtual == 3 && s.DataVencto3 >= start && s.DataVencto3 <= end) || 
     (s.ParcelaAtual == 4 && s.DataVencto4 >= start && s.DataVencto4 <= end) 
select s 

这类似于我会用普通的T-SQL做。

注意到startend是纯C#变量,表示您需要查询的日期时间。

这可能比在where子句中生成SQL CASE语句要好(这也应该是可能的)。当然,OR statements are not really recommended, perfomance-wise。如果这是一个问题,您应该只制作4条LINQ语句并合并其结果。

编辑既然你似乎并不服气,让我给你另一种选择:

(
    from s in ServicosFinanceiro 
    where (s.ParcelaAtual == 1 && s.DataVencto1 >= start && s.DataVencto1 <= end) 
    select s 
).Union(
    from s in ServicosFinanceiro 
    where (s.ParcelaAtual == 2 && s.DataVencto2 >= start && s.DataVencto2 <= end) 
    select s 
).Union(
    from s in ServicosFinanceiro 
    where (s.ParcelaAtual == 3 && s.DataVencto3 >= start && s.DataVencto3 <= end) 
    select s 
).Union(
    from s in ServicosFinanceiro 
    where (s.ParcelaAtual == 4 && s.DataVencto4 >= start && s.DataVencto4 <= end) 
    select s 
) 

,这将产生一个UNION声明,4子查询组成。这与我说的关于合并4个Linq查询的内容类似 - 但我们这样在数据库服务器上这样做(并且SQL Server优化器会考虑DataVencto1 .. DataVencto2的索引)。

+0

我正在尝试使用CASE,但为什么这种方式更好,然后使用CASE?谢谢 –

+0

即使你的索引超过了'DataVencto *'列,'CASE'语句也不会使用它们。使用'OR'语句有时会更好(我有时候会说,因为SQL-Server并不是很好地优化'OR'谓词 - 它最终也可以做一个完整的扫描)。 – rsenna