加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:42:41 所属栏目:百科 来源:网络整理
导读:我有一个StudentReceipts表,它将ReceiptNo存储为字符串(001,002,003,..,099,..). 我想获取最后的receiptno详细信息,以便为下一个事务增加receiptno. 这就是我尝试过的 var _lastGeneratedRecDetails = _db.StudentReceipts .AsEnumerable() .Where(r = r.Sta
我有一个StudentReceipts表,它将ReceiptNo存储为字符串(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();

但是我得到以下例外

this function can only be invoked from linq to entities

任何帮助将受到高度赞赏.

解决方法

通过调用.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,以便能够在内存中进行解析和排序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读