2013-12-10 62 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