1

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

Repository.GetAll 是一个标准的通用获取所有对象,用于从对象上下文中获取实体。

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.IEnumerable1[System.String])' 方法,并且此方法无法转换为存储表达式。"}

我知道它是以下行:

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

SubItemList 是一个列表 PictureUse 是一个实体。

我事先搜索了一下,知道可能是 .Select 没有得到 LINQ to Entities 的正确支持,但我还没有找到任何具体的解决方案。

欢迎任何帮助。

4

2 回答 2

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();
于 2012-11-12T16:56:03.653 回答
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),那么您可能必须先将详细信息检索到匿名对象列表中,然后再将它们转换为列表

例如

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();
于 2012-11-12T16:45:15.453 回答