1 回答

TA貢獻1815條經(jīng)驗 獲得超6個贊
簡單但具體
您可以添加這樣的擴展方法:
public static class DateTimeExtensions
{
public static bool IsBetween(this DateTime thisDateTime, DateTime start, DateTime end)
{
return thisDateTime >= start && thisDateTime <= end;
}
}
您可以單獨進行單元測試。
然后您可以在要檢查的任何日期時間字段上使用它。例如:
var start = new DateTime(2017, 1, 1);
var end = new DateTime(2017, 12, 31, 23, 59, 59);
IList<Contract> contracts = new List<Contract>(); // or anything enumerable
var contractsSignedBetween = contracts.Where(x => x.SignDate.IsBetween(start, end));
var contractsReleasedBetween = contracts.Where(x => x.ReleaseDate.IsBetween(start, end));
(請注意我如何將開始日期時間設(shè)置為 00:00:00 時間,將結(jié)束日期時間設(shè)置為 23:59:59 時間[也可以包括毫秒],以便包括最后一天的時間。)
使其可重用
如果你發(fā)現(xiàn)自己需要做很多事情,你可以做一個擴展
public static class EnumerableContractsExtensions
{
public static IEnumerable<Contract> SignedBetween(this IEnumerable<Contract> contracts, DateTime start, DateTime end)
{
return contracts.Where(x => x.SignDate.IsBetween(start, end));
}
}
并像這樣使用它
var contractsSignedBetween = contracts.SignedBetween(start, end);
也可以單獨進行單元測試。
更靈活但更具體
使用表達式說出您想要的日期...
public static class EnumerableContractsExtensions
{
public static IEnumerable<Contract> Between(this IEnumerable<Contract> contracts, Func<Contract, DateTime> selector, DateTime start, DateTime end)
{
return contracts.Where(x => selector(x).IsBetween(start, end));
}
}
然后做:
var contractsSignedBetween = contracts.Between(x => x.SignDate, start, end);
var contractsReleasedBetween = contracts.Between(x => x.ReleaseDate, start, end);
靈活通用
全力以赴并通用(盡管您不能將其設(shè)為擴展方法,因為它是通用的):
public static class EnumerableExtensions
{
public static IEnumerable<T> Between<T>(IEnumerable<T> items, Func<T, DateTime> selector, DateTime start, DateTime end)
{
return items.Where(x => selector(x).IsBetween(start, end));
}
}
同樣,這本身就是可測試的,可以像這樣使用:
IList<Contract> contracts = new List<Contract>();
IList<PersonalCheck> personalChecks = new List<PersonalCheck>();
var contractsSignedBetween = EnumerableExtensions.Between(contracts, x => x.SignDate, start, end);
var checksSignedBetween = EnumerableExtensions.Between(personalChecks, x => x.SignDate, start, end);
使其可查詢
為了使該方法起作用,IQueryable需要轉(zhuǎn)向表達式樹,因為 LINQ to Entities 不知道如何將方法轉(zhuǎn)換為 SQL。
public static IQueryable<TSource> Between<TSource, TKey>(
this IQueryable<TSource> source,
Expression<Func<TSource, TKey>> keySelector,
TKey low,
TKey high)
where TKey : IComparable<TKey>
{
Expression key = keySelector.Body;
Expression lowerBound = Expression.LessThanOrEqual(Expression.Constant(low), key);
Expression upperBound = Expression.LessThanOrEqual(key, Expression.Constant(high));
Expression and = Expression.AndAlso(lowerBound, upperBound);
Expression<Func<TSource, bool>> lambda =
Expression.Lambda<Func<TSource, bool>>(and, keySelector.Parameters);
return source.Where(lambda);
}
仍然會像這樣使用:
var contractsSignedBetween = contracts.Between(x => x.SignDate, start, end);
這也適用于DateTimes以外的事物。希望這可以幫助。
- 1 回答
- 0 關(guān)注
- 185 瀏覽
添加回答
舉報