2010-11-03 72 views
10

不要以爲這是一個轉貼,很難搜索詞之間的詞,因爲它用於所有內容(如搜索AND)。使用Linq或Lambda表達式的語句之間的SQL等效

我想過濾一個基於日期範圍的列表。

我有一個日期列表,我想過濾一個日期範圍。在SQL中是否有與between語句相同的Linq或Lambda?

例如,下面的代碼不會Linqpad(或Visual Studio)工作:

void Main() 
{ 
    List<ListExample> list = new List<ListExample>(); 

    list.Add(new ListExample("Name1","23 Aug 2010")); 
    list.Add(new ListExample("Name2","23 Aug 2009")); 

    var query = from l in list 
     where l.DateValue between "01 Jan 2010" and "01 Jan 2011" 
     select l; 

} 

public class ListExample 
{ 

    public ListExample(string name, string dateValue) 
    { 
     Name = name; 
     DateValue = DateTime.Parse(dateValue); 
    } 

    public string Name{get;set;} 
    public DateTime DateValue{get;set;} 
} 
+1

看起來像一個副本:http://stackoverflow.com/questions/1447635/linq-between-operator – 2010-11-03 13:47:14

回答

25

像這樣的事情?

var query = from l in list 
      where l.DateValue >= new DateTime(2010, 1, 1) 
       && l.DateValue <= new DateTime(2011, 1, 1) 
      select l; 

您可以編寫自己的擴展方法:

public static bool IsBetween(this DateTime dt, DateTime start, DateTime end) 
{ 
    return dt >= start && dt <= end;  
} 

在這種情況下,查詢看起來是這樣的(方法語法的變化):

var start = new DateTime(2010, 1, 1); 
var end = new DateTime(2011, 1, 1); 
var query = list.Where(l => l.DateValue.IsBetween(start, end)); 

我看你」已經提供了一些日期爲字符串的樣本。如果可能,我肯定會保持解析邏輯(DateTime.ParseExact或其他)與查詢分離。

+0

謝謝我有問題> =和需要創建一個DateTime。我發現Linq有點混亂,因爲他們改變了語法。 – Simon 2010-11-03 13:17:39

+0

@Simon:乾杯。 '> ='與LINQ沒有多大關係;它是'DateTime'上的一個重載操作符。如果您願意,可以使用'DateTime.CompareTo'或類似的。 – Ani 2010-11-03 13:19:55

+0

謝謝Ani - DateTime.Parse只是我在LinqPad的例子,因爲我不想將客戶端代碼發佈到互聯網上。 – Simon 2010-11-03 13:24:29

1
var query = from l in list 
     where new DateTime(1,1,2010) <= l.DateValue and DateValue <= new DateTime(1,1,2011) 
     select l; 

當然,通常警告有關時區和不同的時間對客戶端和服務器應用

+0

如果我鏈接到實體框架,看起來像Linq to Entities不支持擴展方法。這聽起來是正確的還是我錯過了一些東西。 – Simon 2010-11-03 15:18:23

+1

NotSupportedException:方法'布爾IsBetween(System.Nullable'1 [System.DateTime],System.DateTime,System.DateTime,布爾)'沒有支持轉換爲SQL。 – Simon 2010-11-03 15:43:42

1
Datetime DT1 = DateTime.Parse("01 Jan 2010"); 
Datetime DT2 = DateTime.Parse("01 Jan 2011"); 
var query = from l in list 
      where l.DateValue >= DT1 && l.DateValue <= DT2 
      select l; 

在LINQ使用& &和||就像你在C#的正常布爾語句中一樣。