AutoMapper ProjectTo扩展至少有一个对象必须实现IComparable

时间:2017-04-18 06:36:42

标签: c# unit-testing automapper

我正在使用AutoMapper IQueryable扩展ProjectTo来选择数据。 当我试图为使用这种扩展方法的方法编写单元测试时,我得到了这个例外。

至少有一个对象必须实现IComparable。

我还尝试实现ProjectTo扩展中使用的类型接口,但发生了同样的异常。

在单元测试中,我使用 Moq 来模拟EntityFramework DbContext

以下是返回异常的代码:

freePacks = packageQuery.ProjectTo<PackageDTO>();

return new PackageQueryResult
{
  query.OldestPacks
         ? freePacks.OrderBy(p => new { p.ProdDt, p.Cert }).NoLock()
         : freePacks.OrderByDescending(p => new { p.ProdDt, p.Cert }).NoLock()
};

NoLock()

的地方
static List<T> NoLock<T>(this IQueryable<T> query)
{ 
  var txn = new System.Transactions.TransactionScope(TransactionScopeOption.RequiresNew,
            new TransactionOptions
            {
                IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted
            }))
        {
            List<T> toReturn = query.ToList();
            txn.Complete();
            return toReturn;
        }
}

有什么方法可以解决这个问题?

感谢您的任何建议

1 个答案:

答案 0 :(得分:0)

我认为问题是由OrderBy(p => new { p.ProdDt, p.Cert })引起的。您正在创建的任何对象都没有实现IComparable,因此OrderBy不起作用。

如果您需要按多个条件排序,请使用ThenBy方法:

query.OldestPacks
     ? freePacks.OrderBy(p => p.ProdDt).ThenBy(p => p.Cert).NoLock()
     : freePacks.OrderByDescending(p => p.ProdDt).ThenByDescending(p => p.Cert).NoLock();