2

日付が2つの日付の範囲に含まれているかどうかを確認するために、「の間」関数を作成する必要があります。私はこれを書きましたが、うまくいきません:

private static Expression<Func<TElement, bool>> IsDateBetween<TElement>(Expression<Func<TElement, object>> valueSelector, DateTime date)
{
    var p = valueSelector.Parameters.Single();

    var after = Expression.LessThanOrEqual(
        Expression.Property(valueSelector.Body, "FromDate"), Expression.Constant(date.Date, typeof(DateTime)));

    var before = Expression.GreaterThanOrEqual(
        Expression.Property(valueSelector.Body, "ToDate"), Expression.Constant(date.Date, typeof(DateTime)));

    Expression body = Expression.And(after, before);

    return Expression.Lambda<Func<TElement, bool>>(body, p);
}

私はこのように呼んでいます:

DataContext.EventHistories.Where(IsDateBetween<EventHistory>(h => new { h.FromDate, h.ToDate }, dateInTheMiddle))

linq エンティティでは日付がサポートされていないため、この方法を使用する必要があります。

ありがとう

4

4 に答える 4

3

あなたはそのようなことを試すことができます

public static IQueryable<TElement> IsDateBetween<TElement>(this IQueryable<TElement> queryable, 
                                                           Expression<Func<TElement, DateTime>> fromDate, 
                                                           Expression<Func<TElement, DateTime>> toDate, 
                                                           DateTime date)
{
    var p = fromDate.Parameters.Single();
    Expression member = p;

    Expression fromExpression = Expression.Property(member, (fromDate.Body as MemberExpression).Member.Name);
    Expression toExpression = Expression.Property(member, (toDate.Body as MemberExpression).Member.Name);

    var after = Expression.LessThanOrEqual(fromExpression,
         Expression.Constant(date, typeof(DateTime)));

    var before = Expression.GreaterThanOrEqual(
        toExpression, Expression.Constant(date, typeof(DateTime)));

    Expression body = Expression.And(after, before);

    var predicate = Expression.Lambda<Func<TElement, bool>>(body, p);
    return queryable.Where(predicate);
}

利用方法

DataContext.EventHistories.WhereDateBetween(h =>  h.FromDate, h => h.ToDate, dateInTheMiddle));

しかし、それはかなり複雑です

var myDate = DateTime.Now();

var result = DataContext.EventHistories.Where(m => m.FromDate >= myDate && m.ToDate<=myDate );

編集

をシミュレートするには、次のDateTime.Dateようにします。

var myDate = DateTime.Now.Date();
var res = histories.AsQueryable()
.Where(m => 
EntityFunctions.CreateDateTime(m.FromDate.Year, m.FromDate.Month, m.FromDate.Day, 0, 0, 0) >= DateTime.Now && 
EntityFunctions.CreateDateTime(m.ToDate.Year, m.ToDate.Month, m.ToDate.Day, 0, 0, 0) <= DateTime.Now)

またはインターフェイスを作成します

public interface IFromDateToDate
{
    DateTime FromDate { get; set; }
    DateTime ToDate { get; set; }
}

と拡張メソッド

public static IQueryable<T> WhereDatesBetween<T>(this IQueryable<T> queryable, DateTime myDate) where T : IFromDateToDate
{
    myDate = myDate.Date;
    return queryable.Where(m =>
                           EntityFunctions.CreateDateTime(m.FromDate.Year, m.FromDate.Month, m.FromDate.Day, 0, 0, 0) >= myDate &&
                           EntityFunctions.CreateDateTime(m.FromDate.Year, m.FromDate.Month, m.FromDate.Day, 0, 0, 0) <= myDate);
}

利用方法 :

DataContext.EventHistories.WhereDatesBetween(dateInTheMiddle));
于 2012-09-19T14:11:06.237 に答える
1

LinQ to EntitiesはDateTimeをサポートしています-私はそれをプロジェクトで使用していますが、問題はありません:

var now = DateTime.Now;    
var expiredEntities = entities.Repositories.Where(repository => repository.ExpiryDate < now).ToList();
于 2012-09-19T14:06:41.977 に答える
0

さて、私がこれに正しく従うなら、あなたは本当に書きたいと思うでしょう:

from item in MyTable
where FromDate <= Item.Somedate.Date 
   && Item.Somedate.Date <= ToDate
select item

Dateただし、 DateTime のプロパティは LINQ to エンティティでサポートされていないため、できません。

同様に、次のように書くことはできません。

from item in MyTable
where FromDate <= Item.SomeDate 
   && Item.SomeDate <= ToDate
select item

ToDateは真夜中に設定されていると思いItem.SomeDateますが、時間がToDateあれば、ToDate であっても の後になります。

その場合、一般的な方法である適切な解決策は、上限を排他的な値 (つまり、セットの一部ではない最初のもの) にすることです。したがって:

  toDate = toDate.Date.AddDay(1);

from item in MyTable
where FromDate <= Item.SomeDate 
   && Item.SomeDate < ToDate
select item
于 2017-10-04T21:24:15.950 に答える
-1

なぜそのすべての魔法を気にするのですか?なぜこれをしないのですか?

if (date >= startDate and date <= endDate) {

}
于 2012-09-19T13:44:18.663 に答える