我有一个问题,我不确定最好的解决方法。我的解决方案"导致非常复杂的代码。
示例:我的数据模型有沙发和苹果。 Sofa类和Apple类都具有IsFavorite属性和FavoriteChange日期。我有一个像我这样使用的服务:
List<Apple> top25FavApples = _appleService.FindFavorites(25);
List<Sofa> top25FavSofas = _sofaService.FindFavorites(25);
现在我的苹果和沙发都被收藏了,我需要聚集这些集合,按照FavoriteChangeDate排序,然后限制在前25位。这就是我被困住的地方。
可能的解决方案:创建一个中间类来保存Apple / Sofa和FavoriteDate。对中间对象的集合执行选择,然后运行另一个查询以自行获取苹果和沙发。
答案 0 :(得分:2)
最好的解决方案是创建一个IFavoriteable
接口来定义FavoriteChangeDate
属性并让两个类实现它。然后,您可以转换为IFavoriteable
并在其上执行Linq OrderBy
。
class Program
{
static void Main()
{
List<Apple> top25FavApples = _appleService.FindFavorites(25);
List<Sofa> top25FavSofas = _sofaService.FindFavorites(25);
List<IFavoriteable> top25Total = top25FavApples.Concat<IFavoriteable>(top25FavSofas)
.OrderBy(x => x.FavoriteChangeDate)
.Take(25).ToList();
}
}
public interface IFavoriteable
{
DateTime? FavoriteChangeDate { get; }
}
public class Apple : IFavoriteable
{
public DateTime? FavoriteChangeDate { get; set; }
//...
}
public class Sofa : IFavoriteable
{
public DateTime? FavoriteChangeDate { get; set; }
//...
}
答案 1 :(得分:0)
如果你不能添加一些接口或基类(这会更好),一个选项就是以动态方式转换为动态和查询,例如:
top25FavApples.Cast<dynamic>()
.Concat(top25Sofas.Cast<dynamic>())
.OrderBy(x => (DateTime)x.FavoriteChangeDate).Take(25)