发生了NotSupportedException LINQ to Entities无法识别方法ToList

时间:2012-11-12 14:09:05

标签: linq entity-framework linq-to-entities

我正在使用带有WCF后端的ASP.NET MVC 4.5应用程序,其中实体框架5用作数据访问。 PictureUse是实体,PictureUsageContract是通过WCF传输的DataContract。

Repository.GetAll是一个标准的泛型get all,可以从对象上下文中获取实体。

var allPictureUses = _pictureUseRepository.GetAll()
                .Where(x => x.Name != null)
                .Include(x => x.PictureUse1)
                .Select(x => new PictureUsageContract()
                {
                    ID = x.ID,
                    DefaultPrice = x.DefaultPrice,
                    Name = x.Name,
                    UseDescription = x.UseDescription,
                    SubItemList = x.PictureUse1.Select(c => c.UseDescription).ToList()        

                }).ToList();

调试时收到异常:{“LINQ to Entities无法识别方法'System.Collections.Generic.List 1[System.String] ToList[String](System.Collections.Generic.IEnumerable 1 [System.String])'方法,并且此方法无法转换为商店表达。“}

我知道这是以下一行:

  SubItemList = x.PictureUse1.Select(c => c.UseDescription).ToList()  

SubItemList是List PictureUse是一个实体。

我事先搜索了一下,知道它可能是那样。但LINQ to Entities没有正确支持选择,但我没有找到解决这个问题的具体方法。

欢迎任何帮助。

2 个答案:

答案 0 :(得分:1)

尝试

var allPictureUses = _pictureUseRepository.GetAll()
                .Where(x => x.Name != null)
                .Include(x => x.PictureUse1)

                .ToArray()

                .Select(x => new PictureUsageContract()
                {
                    ID = x.ID,
                    DefaultPrice = x.DefaultPrice,
                    Name = x.Name,
                    UseDescription = x.UseDescription,
                    SubItemList = x.PictureUse1.Select(c => c.UseDescription).ToList()        
            }).ToList();

答案 1 :(得分:0)

如果您收到错误消息称Linq To Entities不支持ToList,那么显而易见的事情就是将其删除。

所以我会尝试

var allPictureUses = _pictureUseRepository.GetAll()
            .Where(x => x.Name != null)
            .Include(x => x.PictureUse1)
            .Select(x => new PictureUsageContract()
            {
                ID = x.ID,
                DefaultPrice = x.DefaultPrice,
                Name = x.Name,
                UseDescription = x.UseDescription,
                SubItemList = x.PictureUse1.Select(c => c.UseDescription)        

            }).ToList();

如果这不起作用(例如,它可能不允许您分配给SubItemList),那么在将它们转换为List之前,您可能必须将详细信息检索到匿名对象列表中

例如

var allPictureUses = _pictureUseRepository.GetAll()
            .Where(x => x.Name != null)
            .Include(x => x.PictureUse1)
            .Select(x => new 
            {
                ID = x.ID,
                DefaultPrice = x.DefaultPrice,
                Name = x.Name,
                UseDescription = x.UseDescription,
                SubItemList = x.PictureUse1.Select(c => c.UseDescription)        

            }).ToList()

            .Select(x => new PictureUsageContract()
            {
                ID = x.ID,
                DefaultPrice = x.DefaultPrice,
                Name = x.Name,
                UseDescription = x.UseDescription,
                SubItemList = x.SubItemList.ToList()     

            }).ToList();