如何在C#中取ModifiedDate与xxxModified的最大日期赋值给Modified?
实现Modified属性返回两个日期的最大值
你的代码如下:
[Column, Nullable] public DateTime? ModifiedDate { get; set; } [Association(QueryExpressionMethod = nameof(GetfffModified), CanBeNull = true)] public DateTime? xxxModified { get; set; } public static Expression<Func<Offer, IDataContext, IQueryable<DateTime?>>> GetfffModified() { return (obj, db) => db.GetTable<OfferProducts>() .Where(rel => rel.OfferId == obj.OfferId) .OrderByDescending(i => i.ModifiedDate) .Select(x => x.ModifiedDate) .Take(1); } // here I am trying to set max date between ModifiedDate and xxxModified public DateTime? Modified { get { return ModifiedDate; } set { ModifiedDate = value; } }
完全可以实现让Modified属性返回ModifiedDate和xxxModified的最大值,分两种场景处理:
1. 内存中计算(实体已加载到内存)
直接修改Modified的getter逻辑,处理null值的情况,取两个日期的最大值:
public DateTime? Modified { get { // 两个都为null时返回null,否则取非null值中的最大值 var validDates = new List<DateTime?> { ModifiedDate, xxxModified }.Where(d => d.HasValue); return validDates.Any() ? validDates.Max() : null; } set { ModifiedDate = value; } }
注意:如果xxxModified是延迟加载的,访问这个属性会触发数据库查询,若要避免性能问题,建议提前通过预加载操作加载相关的OfferProducts数据。
2. 支持数据库查询转换(用于LINQ查询中)
如果需要在数据库层面直接计算这个最大值(比如在Where、OrderBy等查询语句中使用Modified),直接在实体getter中写逻辑可能无法被ORM解析,这时候可以在查询时手动计算:
var query = db.GetTable<Offer>() .Select(o => new OfferViewModel { // 映射其他需要的属性 ModifiedDate = o.ModifiedDate, xxxModified = o.xxxModified, // 直接在查询中计算两者的最大值 Modified = new[] { o.ModifiedDate, o.xxxModified }.Max() });
你也可以修改关联查询的逻辑,把最大值计算整合到静态表达式方法中,但这种方式需要你的ORM支持自定义表达式的解析。
内容的提问来源于stack exchange,提问作者tesrer
相关产品推荐
相关产品推荐

