方法将实体映射到获取调用错误的poco

本文关键字:调用 错误 poco 获取 实体 映射 方法 | 更新日期: 2023-09-27 18:04:56

我得到" LINQ表达式节点类型'Invoke'在LINQ到实体中不受支持。"错误与这位代码。

函数调用

IEnumerable<OrderListItem> orders;
orders = _service.GetAllForUser<OrderListItem>(userName, mapOrderToListItem);
var foo = orders.ToArray();        

功能
public IEnumerable<T> GetAllForUser<T>(string userName, Func<Order, T> mapper)
{
    string displayName = _adService.GetDisplayName(userName);
    return _repo.Query().Where(x => x.OrderedBy == userName)
       .OrderBy(x => x.OrderDate)
       .Select(x => mapper(x))
       .AsEnumerable();
}
private OrderListItem mapOrderToListItem(Order order)
{
    OrderListItem result = new OrderListItem
    {
        DeliveryLoc = order.OrderGroup.DeliveryLocation.Name,
        Department = order.OrderGroup.Department.Name,
        Id = order.Id,
        OrderDate = order.OrderDate,
        OrderedBy = order.OrderedBy,
        Status = !order.ApprovedDate.HasValue ? "SUBMITTED" : !order.ReceivedDate.HasValue ? order.ApprovalStatus == ApprovalStatus.Approved ? "APPROVED" : "DENIED" : !order.FilledDate.HasValue ? "RECEIVED" : "FILLED"
    };
    return result;
}

然而我没有收到调用错误与这位代码

函数调用

IEnumerable<ProductListItem> products;
products = _service.SearchAll<ProductListItem>(sSearch, 0, all, orderBy, sortDir, productListItemMapper);
var foo = products.ToArray();

函数
public IEnumerable<T> SearchAll<T>(string sSearch, int skip, int take, Func<Product, IComparable> sortCol, DAL.SortDir sortDir, Func<Product, T> mapper)
{
    switch (sortDir)
    {
        case DAL.SortDir.asc:
            return _repo.Query().Where(r => (r.Name.Contains(sSearch) || r.CatalogNumber.Contains(sSearch)))
                .OrderBy(sortCol).Skip(skip).Take(take).Select(x => mapper(x)).AsEnumerable();
        case DAL.SortDir.dsc:
            return _repo.Query().Where(r => (r.Name.Contains(sSearch) || r.CatalogNumber.Contains(sSearch)))
                .OrderByDescending(sortCol).Skip(skip).Take(take).Select(x => mapper(x)).AsEnumerable();
        default:
            throw new ArgumentException("sortDir");
    }
}
private ProductListItem productListItemMapper(Product product)
{
    ProductListItem output = new ProductListItem
    {
        Id = product.Id,
        Location = product.WarehouseLocation.Name,
        Name = product.Name,
        Active = product.Active,
        Number = product.CatalogNumber,
        Units = product.UnitOfMeasure.Name,
        UnitsId = product.UnitOfMeasureId,
        LocationId = product.WarehouseLocationId
    };
    return output;
}
我觉得我只是盲目,错过了一些简单的东西。为什么它对产品有效而对订单无效?

方法将实体映射到获取调用错误的poco

只是对于错误消息,我可以认为这是因为你试图在sql server端使用调用,尝试将结果首先转换为集合(列表/数组)然后使用你的函数,所以"选择(e => mapper(e))"首先做一个ToList()然后选择。这是因为IQueryable在sql上执行你的命令,而sql不知道你的mapper函数。

编辑:请记住ToList将检索数据库中的所有记录