2012-11-12 35 views
1

我与一个WCF后端其中实体框架5用作数据访问一个ASP.NET MVC 4.5应用程序的工作方法。 PictureUse是实体,PictureUsageContract是通过WCF传输的DataContract。NotSupportedException异常发生LINQ到实体不承认ToList

的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实体无法识别方法‘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支持到实体,但我还没有发现任何具体的解决这个问题。

任何帮助将受到欢迎。

+0

感谢您的回答,但PictureUse1给人pictureUse对象的列表,而不是一个字符串的列表(说PictureUse的属性),我需要的。 –

回答

0

如果您收到一个错误,指出LINQ到实体不支持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(); 
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

在这种情况下停止它缓冲所有的数据调用.AsEnumerable()而不是.ToArray()会更好。 – user1793607