2013-12-10 3 views
0

:는 예를 들어, 내가 다른 컬럼의 값에 따라 날짜 시간 값을 비교하고 싶은 열을 선택할 수있는 경우 내가 알고 싶은

:

내 모델은 다음과 같습니다

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; } 
} 

ParcelAAual 값에 따라 DataVencto1 또는 DataVencto2 또는 DataVencto3 또는 DataVencto4의 datetime 범위에있는 행을 linq을 사용하여 sql으로 선택하려고합니다.

ParcelaAtual = 1 인 경우 DataVencto1 열의 날짜를 비교해야합니다. ParcelaAtual = 2 인 경우 DataVencto2 열의 날짜를 비교해야합니다.

현재 모든 행을 선택하고 ParcelaAtual 값을 확인하기 위해 foreach를 수행하고 있습니다. 범위의 DataVencto 열을 가져 와서 다른 모델 객체에 추가하십시오.

linq to sql을 사용하여 select 문에서이를 수행 할 수 있습니까?

답변

0

그냥 일반 T-SQL을 사용하여 어떻게 할 것인지 비슷이

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 

그런 짓을.

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 최적화 프로그램에서 고려됩니다).

+0

저는 CASE와 관련을 시도했지만이 방법이 더 나은 이유는 무엇입니까? 감사합니다. –

+0

'DataVencto * '컬럼에 대한 인덱스가 있더라도'CASE' 구문은 절대 사용하지 않을 것입니다. 'OR' 문을 사용하는 것이 때로는 더 좋을 때가 있습니다. (SQL-Server가 OR 선언문을 최적화하는 것이 좋지 않기 때문에 가끔씩 말합니다. 전체 검사도 끝낼 수 있습니다). – rsenna

관련 문제