LINQ到实体不能识别方法.,并且此方法不能转换为存储表达式

本文关键字:不能 转换 此方法 存储 表达式 实体 识别 方法 LINQ | 更新日期: 2023-09-27 18:15:51

我的函数是在lambda表达式

public IList<ent_Message> messageDetailsArray(decimal from,decimal to)
        {
            owncibai_ExamEntities db = new owncibai_ExamEntities();
            var details = db.Messages.OrderBy(or=>or.mDate).Where(wh => (wh.userNumber==from && wh.messageTo==to) || (wh.messageTo==from && wh.userNumber==to)).Select(a => new ent_Message
            {
                isRead = a.isRead,
                mDate = a.mDate,
                Message1 = a.Message1,
                messID = a.messID,
                userNumber = a.userNumber,
                messageTo=a.messageTo,
                Name=a.User.First_Name+" "+a.User.Last_Name,
                photo = (db.MessagePhotoes.Where(ph => ph.messID == a.messID).Select(b => new ent_MessagePhoto
                {
                    msgPhoto=b.msgPhoto,
                    srl=b.srl
                })).ToList()
            }).ToList();
            var update = db.Messages.Where(wh => wh.messageTo == from).ToList();
            update.ForEach(a => a.isRead = true);
            db.SaveChanges();
            return details;
        }

当我从列表中删除照片参数时,它工作正常。当我添加照片时,它会给出以下错误。

LINQ to Entities不能识别方法'System.Collections.Generic.List 1[Entities.ent_MessagePhoto] ToList[ent_MessagePhoto](System.Collections.Generic.IEnumerable 1[Entities. ent_messagepphoto])',并且该方法不能转换为存储表达式。

实体类如下

public class ent_Message{
     public decimal messID { get; set; }
        public Nullable<decimal> userNumber { get; set; }
        public Nullable<decimal> messageTo { get; set; }
        public Nullable<System.DateTime> mDate { get; set; }
        public string ip { get; set; }
        public string Message1 { get; set; }
        public Nullable<bool> isRead { get; set; }
        public Nullable<decimal> parentID { get; set; }
        public string Name { get; set; }
        public IList<ent_MessagePhoto> photo { get; set; }
}

我完全不知道我在照片中哪里错了…

Thanks in advance

LINQ到实体不能识别方法.,并且此方法不能转换为存储表达式

这一点:

photo = (db.MessagePhotoes.Where(ph => ph.messID == a.messID).Select(b => new ent_MessagePhoto
    {
        msgPhoto=b.msgPhoto,
        srl=b.srl
    })).ToList() //<-right here

出现在外部Select子句中。当IQueryProvider试图将外部Select语句转换为有效的SQL时,它将看到内部Select,当然可以转换为SQL,但随后它将击中ToList()调用并失败,因为在SQL中没有等效的。

如果你想在你的Select投影中执行一些不能在SQL中完成的操作,它们需要在。net应用程序端内存中的查询结果集上完成。一种常见的方法是将ToList() 放在select语句之前——这将被解释为"将Where和OrderBy部分发送给SQL,将完整的结果集带回List, 然后执行select投影"。

ent_messagepphoto必须在类定义

public class ent_Message<ent_MessagePhoto>
    {
        public decimal messID { get; set; }
        public Nullable<decimal> userNumber { get; set; }
        public Nullable<decimal> messageTo { get; set; }
        public Nullable<System.DateTime> mDate { get; set; }
        public string ip { get; set; }
        public string Message1 { get; set; }
        public Nullable<bool> isRead { get; set; }
        public Nullable<decimal> parentID { get; set; }
        public string Name { get; set; }
        public IList<ent_MessagePhoto> photo { get; set; }
    }​

谢谢你的建议,我已经解决了这个问题。问题只是版本问题。我用的是5。X更新为6。