61
var _My_ResetSet_Array = _DB
    .tbl_MyTable
    .Where(x => x.Active == true
        && x.DateTimeValueColumn <= DateTime.Now)
    .Select(x => x);

上面的查询工作正常。
但我只想检查日期值。
但上层查询检查日期+时间值。

在传统的 mssql 中,我可以编写如下查询。

SELECT * FROM dbo.tbl_MyTable
WHERE 
CAST(CONVERT(CHAR(10), DateTimeValueColumn, 102) AS DATE) <= 
            CAST(CONVERT(CHAR(10),GETDATE(),102) AS DATE)
AND
Active = 1

那么任何人都可以给我建议我如何只检查 Linq 中的日期值。

4

10 回答 10

132

EF 6.0中也有EntityFunctions.TruncateTimeorDbFunctions.TruncateTime

于 2013-11-12T17:08:33.760 回答
20

解决此问题的简单解决方法,仅比较日期部分

var _My_ResetSet_Array = _DB
                    .tbl_MyTable
                    .Where(x => x.Active == true && 
                               x.DateTimeValueColumn.Year == DateTime.Now.Year
                            && x.DateTimeValueColumn.Month == DateTime.Now.Month
                            && x.DateTimeValueColumn.Day == DateTime.Now.Day);

因为 linq to entity 不支持 'Date' 数据类型,其中 Year、Month 和 Day 是 'int' 数据类型并且受支持。

于 2012-11-22T11:35:03.993 回答
4

编辑

为避免此错误:LINQ to Entities 不支持指定的类型成员“日期”。仅支持初始化程序、实体成员和实体导航属性。

var _My_ResetSet_Array = _DB
                .tbl_MyTable
                .Where(x => x.Active == true)
                         .Select(x => x).ToList();

 var filterdata = _My_ResetSet_Array
        .Where(x=>DateTime.Compare(x.DateTimeValueColumn.Date, DateTime.Now.Date)  <= 0 );

第二行是必需的,因为 LINQ to Entity 无法将日期属性转换为 sql 查询。所以最好先获取数据然后应用日期过滤器。

编辑

如果您只想比较日期时间的日期值而不是使用

DateTime.Date属性- 获取此实例的日期组件。

给你的代码

var _My_ResetSet_Array = _DB
                .tbl_MyTable
                .Where(x => x.Active == true
     && DateTime.Compare(x.DateTimeValueColumn.Date, DateTime.Now.Date)  <= 0 )
                         .Select(x => x);

如果是这样,那么使用

DateTime.Compare 方法- 比较 DateTime 的两个实例并返回一个整数,指示第一个实例是早于、相同还是晚于第二个实例。

给你的代码

var _My_ResetSet_Array = _DB
                .tbl_MyTable
                .Where(x => x.Active == true
                  && DateTime.Compare(x.DateTimeValueColumn, DateTime.Now)  <= 0 )
                         .Select(x => x);

例子

DateTime date1 = new DateTime(2009, 8, 1, 0, 0, 0);
DateTime date2 = new DateTime(2009, 8, 1, 12, 0, 0);
int result = DateTime.Compare(date1, date2);
string relationship;

if (result < 0)
   relationship = "is earlier than";
else if (result == 0)
   relationship = "is the same time as";         
else
   relationship = "is later than";
于 2012-11-22T10:41:51.260 回答
2
 result = from r in result where (r.Reserchflag == true && 
    (r.ResearchDate.Value.Date >= FromDate.Date && 
     r.ResearchDate.Value.Date <= ToDate.Date)) select r;
于 2015-01-09T06:15:22.997 回答
1

&& x.DateTimeValueColumn <= DateTime.Now

只要您的架构正确,就支持此功能

&& x.DateTimeValueColumn.Value.Date <=DateTime.Now
于 2013-10-08T19:10:50.493 回答
1

在类似的情况下,我使用了以下代码:

DateTime upperBound = DateTime.Today.AddDays(1); // If today is October 9, then upperBound is set to 2012-10-10 00:00:00
return var _My_ResetSet_Array = _DB
    .tbl_MyTable
    .Where(x => x.Active == true
        && x.DateTimeValueColumn < upperBound) // Accepts all dates earlier than October 10, time of day doesn't matter here
    .Select(x => x);
于 2013-10-09T11:32:03.133 回答
0

工作代码:

     {
        DataBaseEntity db = new DataBaseEntity (); //This is EF entity
        string dateCheck="5/21/2018";
        var list= db.tbl
        .where(x=>(x.DOE.Value.Month
              +"/"+x.DOE.Value.Day
              +"/"+x.DOE.Value.Year)
             .ToString()
             .Contains(dateCheck))
     }
于 2018-05-21T19:07:52.113 回答
0

试试这个,

var _My_ResetSet_Array = _DB
    .tbl_MyTable
    .Where(x => x.Active == true
         && x.DateTimeValueColumn <= DateTime.Now)
    .Select(x => x.DateTimeValueColumn)
    .AsEnumerable()
    .select(p=>p.DateTimeValueColumn.value.toString("YYYY-MMM-dd");
于 2018-09-21T07:13:16.303 回答
0

不要简化代码以避免“linq 翻译错误”:测试包含时间为 0:0:0 的日期和时间为 23:59:59 的同一日期

        iFilter.MyDate1 = DateTime.Today;  // or DateTime.MinValue

        // GET 
        var tempQuery = ctx.MyTable.AsQueryable();

        if (iFilter.MyDate1 != DateTime.MinValue)
        {
            TimeSpan temp24h = new TimeSpan(23,59,59);
            DateTime tempEndMyDate1 = iFilter.MyDate1.Add(temp24h);

            // DO not change the code below, you need 2 date variables...
            tempQuery = tempQuery.Where(w => w.MyDate2 >= iFilter.MyDate1
                                          && w.MyDate2 <= tempEndMyDate1);
        }

        List<MyTable> returnObject = tempQuery.ToList();
于 2020-02-06T15:43:21.490 回答
-4

仅用于mydate.Date处理 DateTime 类的日期部分。

于 2012-11-22T10:42:13.440 回答