根据列值更改选择条件

时间:2013-12-10 12:28:09

标签: c# sql-server asp.net-mvc linq-to-sql entity-framework-4

我想知道是否可以根据另一列的值选择我想要比较日期时间值的列,例如:

我的模型看起来像这样:

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语句中实现?

1 个答案:

答案 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所做的类似。

注意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
)

这将生成一个由{4}子查询组成的UNION语句。这类似于我所说的关于组合4个Linq查询的内容 - 但我们在数据库服务器上这样做(并且DataVencto1 DataVencto2上的索引将由SQL Server优化器考虑) 。