2010-11-03 32 views
10

Đừng nghĩ rằng đây là một repost, khó tìm kiếm từ giữa vì nó được sử dụng trong mọi thứ (như tìm kiếm AND).Tương đương với câu lệnh SQL giữa sử dụng LINQ hoặc biểu thức Lambda

Tôi muốn lọc danh sách dựa trên phạm vi ngày.

Tôi có danh sách có một số ngày và tôi muốn lọc chúng theo phạm vi ngày. Có một LINQ hoặc Lambda tương đương với câu lệnh between trong SQL.

Ví dụ, đoạn code dưới đây sẽ không làm việc trong LINQPad (hoặc 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

trông giống như một bản sao của: http://stackoverflow.com/questions/1447635/linq-between-operator –

Trả lời

25

Something như thế này?

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

Bạn có thể viết phương pháp của riêng bạn mở rộng:

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

Trong trường hợp này, truy vấn sẽ giống như thế (cú pháp phương pháp cho một sự thay đổi):

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

Tôi thấy bạn' đã cung cấp một số mẫu có ngày tháng là chuỗi. Tôi sẽ chắc chắn giữ logic phân tích cú pháp (DateTime.ParseExact hoặc khác) tách khỏi truy vấn, nếu có thể.

+0

Cảm ơn tôi đã gặp sự cố với> = và cần tạo một Ngày giờ. Tôi thấy LINQ hơi khó hiểu vì họ đã thay đổi cú pháp. – Simon

+0

@Simon: Chúc mừng. '> =' Không có nhiều việc phải làm với LINQ; nó là một toán tử quá tải trên 'DateTime.' Bạn có thể sử dụng' DateTime.CompareTo' hoặc tương tự nếu bạn thích. – Ani

+0

Cảm ơn Ani - DateTime.Parse chỉ dành cho ví dụ của tôi trong LinqPad vì tôi không muốn đăng mã khách hàng lên internet. – Simon

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

tất nhiên, thường cảnh báo về múi giờ và thời điểm khác nhau trên client và server áp dụng

+0

Có vẻ như các phương thức mở rộng không được hỗ trợ bởi LINQ to Entities nếu tôi liên kết với khung thực thể. Điều này âm thanh chính xác hoặc tôi thiếu một cái gì đó. – Simon

+1

NotSupportedException: Phương thức 'Boolean IsBetween (System.Nullable'1 [System.DateTime], System.DateTime, System.DateTime, Boolean)' không có bản dịch được hỗ trợ cho SQL. – Simon

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; 

trong LINQ bạn sử dụng & & và || như bạn sẽ làm trong một câu lệnh boolean bình thường của C#.

Các vấn đề liên quan