LINQ to Entities无法识别方法...,并且此方法无法转换为商店表达式

时间:2015-10-04 14:59:41

标签: c# linq

我的功能与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;
        }

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

  

LINQ to Entities无法识别方法&#39; System.Collections.Generic.List 1[Entities.ent_MessagePhoto] ToList[ent_MessagePhoto](System.Collections.Generic.IEnumerable 1 [Entities.ent_MessagePhoto])&#39;方法,并且此方法无法转换为商店表达式。

实体类如下

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; }
}

我对照片中的错误感到困惑...

提前致谢

3 个答案:

答案 0 :(得分:2)

这一位:

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() - 这将被解释为“将Where和OrderBy部件发送到SQL,将完整的结果集放回到列表,然后执行选择投影“。

答案 1 :(得分:0)

ent_MessagePhoto必须在类定义

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; }
    }​

答案 2 :(得分:0)

感谢您的建议我解决了这个问题。问题仅限版本。我使用5.x并更新到6.x并且工作正常。