只能通过全文搜索从LINQ to Entities错误调用此函数

时间:2017-12-21 04:11:24

标签: c# entity-framework linq projection iqueryable

尝试使用全文搜索并因DbFunctions.AddHours函数调用而投影到视图模型时出现问题。如果没有在搜索视图模型中输入任何值来触发全文搜索方法,那么一切正常。但是一旦触发全文搜索方法,然后调用视图模型投影,我就会收到错误:

  

只能从LINQ to Entities调用此函数。

在这两种情况下,代码都将IQueryable<OrderHeader>传递给视图模型投影,所以我不确定为什么全文搜索方法不起作用或者是否有办法使其工作。

在代码中,您将看到我首先将IQueryable枚举到列表中,然后将AsQueryable标记为尝试解决,但也无效。但  我最初只传递了Orders IQueryable,两者都给出了同样的错误。

我不想编写两种不同的视图模型投影方法,具体取决于是否触发全文搜索,是否可能?

奖金问题:理想情况下,我还想将全文IQueryable结果与以下条件相结合......所以继续能够将其他.Where条款链接到完整的文本搜索IQueryable结果(例如,像IsStorePickup子句的最后一行)......可能吗?

查询逻辑:

IQueryable<OrderHeader> Orders = _orderHeaderRepository
    .SearchFor(x => 
        x.FacilityId == intFacilityId
        && x.OrderType == strOrderType);

//Get Filters
if (!String.IsNullOrEmpty(searchViewModel.CustomerFreeText))
{
    Orders = _orderHeaderRepository.GetOrdersByCustomerFullTextSearch(intFacilityId, searchViewModel.CustomerFreeText);

    return listViewModel.ConvertClassToViewModel(Orders.ToList().AsQueryable());
}

if (searchViewModel.IsStorePickup) 
{ 
    Orders = _orderHeaderRepository.SearchFor(Orders, x => x.PickUpInStore == true); 
}

全文搜索方法,返回IQueryable<OrderHeader>

public IQueryable<OrderHeader> GetOrdersByCustomerFullTextSearch(int intFacilityId, string strSearchTerm)
{
    string sql = "SELECT * " +
        "FROM OrderHeader " +
        "WHERE FacilityId = @p0 AND CONTAINS(*, @p1)";

    var orderByCustomerFullTextQuery = base.DbSet.SqlQuery(sql, intFacilityId, "\"" + strSearchTerm + "*\"").AsQueryable();

    return orderByCustomerFullTextQuery;
}

查看模型投影:

IQueryable<ShipOrderSearchResultsViewModel> viewModel =
    orders.Select(oh => new ShipOrderSearchResultsViewModel()
        {
            ...
           CreatedOn = System.Data.Entity.DbFunctions.AddHours(oh.CreatedOn, userTimeZoneOffset).Value
            ...
        });

0 个答案:

没有答案