我想知道是否可以根据另一列的值选择我想要比较日期时间值的列,例如:
我的模型看起来像这样:
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 :(得分: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所做的类似。
注意start
和end
是纯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
)
这将生成一个由{4}子查询组成的UNION
语句。这类似于我所说的关于组合4个Linq查询的内容 - 但我们在数据库服务器上这样做(并且DataVencto1
DataVencto2
上的索引将由SQL Server优化器考虑) 。