第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

比較執(zhí)行期間指定的日期時間字段的 C# 方法?

比較執(zhí)行期間指定的日期時間字段的 C# 方法?

C#
尚方寶劍之說 2021-07-09 10:01:54
我的項目有許多帶有日期字段的對象,我經(jīng)常需要選擇一個這樣的字段在日期范圍內(nèi)的所有內(nèi)容。例如:public class Contract{    public DateTime SignDate { get; set; }    public DateTime ReleaseDate { get; set; }}public class PersonalCheck{    public DateTime SignDate { get; set; }    public DateTime ProcessDate { get; set; }    public DateTime VoidDate { get; set; }}如果我只關(guān)心 SignDate,那會很容易。我會聲明一個接口...public interface IObjectWithSignDate{    DateTime SignDate { get; set; }}...更改我的其他對象以從它繼承,然后創(chuàng)建一個這樣的方法:    public static IQueryable<T> SignedWithin<T>(this IQueryable<T> items, DateTime start, DateTime end) where T : IObjectWithSignDate    {        return items.Where(q => q.SignDate >= start && q.SignDate <= end);    }如何避免為 ReleaseDate、ProcessDate、VoidDate 等重寫此函數(shù)?我可以讓這個方法接受任何對象的 IQueryable 和一個告訴它運行這個選擇器的日期字段的變量嗎?請注意,這必須能夠 a) 在 LinqToEntities 中執(zhí)行以針對數(shù)據(jù)庫運行并且 b) 不會增加大量開銷(因為我擔(dān)心反射可能會這樣做)
查看完整描述

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以外的事物。希望這可以幫助。


查看完整回答
反對 回復(fù) 2021-07-18
  • 1 回答
  • 0 關(guān)注
  • 185 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號