Linq异常:函数只能从linq调用到实体

时间:2016-03-25 08:38:29

标签: c# entity-framework linq asp.net-mvc-4

我有一个StudentReceipts表,其中ReceiptNostring(001,002,003,..,099,..)

我想去获取最后的receiptno详细信息,以便为下一次交易增加receiptno。

这就是我试过的

  var _lastGeneratedRecDetails = _db.StudentReceipts
                                 .AsEnumerable()
                                 .Where(r => r.Status == true
                                             && EntityFunctions.TruncateTime(r.DueDate.Value) >= _startDate.Date
                                             && EntityFunctions.TruncateTime(r.DueDate.Value) <= _endDate.Date)                                                
                                            .OrderByDescending(x => Int32.Parse(x.ReceiptNo))
                                            .FirstOrDefault();

但是我得到以下异常

  

此函数只能从linq调用到实体

任何帮助都将受到高度赞赏。

3 个答案:

答案 0 :(得分:11)

通过调用.AsEnumerable(),您将从Linq-To-Entities转到Linq-To-Object。通过调用它,您还可以过滤内存中的所有结果,因此每次执行该查询时,您都会从数据库中提取整个StudentReceipts表,因为它在.AsEnumerable()方法之后执行。一般规则是尝试在数据库端尽可能多地做:

var _lastGeneratedRecDetails = 
   _db.StudentReceipts.Where(r => r.Status == true
                       && EntityFunctions.TruncateTime(r.DueDate.Value) >= _startDate.Date
                       && EntityFunctions.TruncateTime(r.DueDate.Value) <= _endDate.Date)             
                      .AsEnumerable()                                   
                      .OrderByDescending(x => Int32.Parse(x.ReceiptNo))
                      .FirstOrDefault();

如果你这样做,你将过滤数据库中的所有内容并获取过滤后的结果。我不知道x.ReceiptNo是什么类型,但Linq-To-Entities中不允许调用Int.Parse。您可以先过滤,然后调用AsEnumerable以便能够在内存中进行解析和排序。

答案 1 :(得分:1)

使用和 .AsQueryable()

var _lastGeneratedRecDetails = _db.StudentReceipts
                             .AsEnumerable().AsQueryable()

答案 2 :(得分:1)

就我而言,在我已经使用SQL处理查询之后,我在后续处理语句中重新使用了包含 DbFunctions.TruncateTime 的Func / Filter表达式。删除它会为我清除异常实例。