使用Linq或Lambda表达式在语句之间的等效SQL

时间:2010-11-03 13:07:29

标签: linq c#-4.0 lambda

不要认为这是一个重新发布,难以搜索之间的单词,因为它被用于所有内容(例如搜索AND)。

我想根据日期范围过滤列表。

我有一个包含日期的列表,我希望按日期范围过滤它们。 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;}
}

3 个答案:

答案 0 :(得分:26)

这样的东西?

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或其他)与查询分开。

答案 1 :(得分:1)

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

当然,通常会在客户端和服务器上发出关于时区和不同时间的警告

答案 2 :(得分: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中你使用&amp;&amp;和||就像在C#的普通布尔语句中一样。