LINQ to Entity Framework 多对多与字符串列表

Posted

技术标签:

【中文标题】LINQ to Entity Framework 多对多与字符串列表【英文标题】:LINQ to Entity Framework many to many with list of strings 【发布时间】:2011-09-04 12:24:43 【问题描述】:

这个问题是从以下继续: Can't think of query that solves this many to many

这个 LINQ 查询是用户 @juharr 推荐给我的,我只是添加了字符串连接,目的是将名字和姓氏组合成全名。

var courseViews = from c in db.Courses 选择新的 CourseView() CourseID = c.ID, ProfessorName =(来自 c.Leturers 中的 l l.Is_Professor 在哪里 选择 l.LastName+" "+l.FirstName).FirstOrDefault(), AssistantNames =(来自 c.Leturers 中的 l 在哪里!l.Is_Professor 选择 l.LastName+" "+l.FirstName) .ToList() //hmmm 问题 ;

我使用的 ModelView 是另一个可能的问题原因:

公开课 CourseView 公共 int ID 获取;放; 公共字符串 CourseName 获取;放; 公共字符串教授姓名得到;放; 公共列表 AssistantNames get;放;

嗯,助手名称的字符串列表有问题不是吗? 在我的愚蠢结束时,在 View 中,我用@foreach(var s in item.AssistantNames)@s循环浏览了这个列表 @Ladislav 建议使用 IQueryable 而不是字符串,如何在哪里?

对于我到目前为止所做的解决方案,我得到以下 错误

LINQ to Entities 无法识别方法 'System.Collections.Generic.List1[System.String] ToList[String](System.Collections.Generic.IEnumerable1[System.String])' 方法,并且此方法无法转换为存储表达式。

需要帮助!

【问题讨论】:

public List AssistantNames get; set; 可能是public List<string> AssistantNames get; set; 【参考方案1】:

删除 ToList() 调用,然后将 Assistants 属性更改为:

public IQueryable AssistantNames  get; set; 

【讨论】:

【参考方案2】:

看看这是否有效

var courseViews = from c in db.Courses
                  let assistantsList =  (from l in c.Leturers   
                                        where !l.Is_Professor   
                                        select l.LastName+" "+l.FirstName).ToList()   
                  select new CourseView()  
                    
                      CourseID = c.ID,  
                      ProfessorName = (from l in c.Leturers   
                                       where l.Is_Professor   
                                       select l.LastName+" "+l.FirstName).FirstOrDefault(),  
                      AssistantNames =  assistantsList
                  ;

【讨论】:

【参考方案3】:

另一种方法是,因为无论如何您都在具体化所有课程以将查询分成两部分,第一个具体化数据,第二个使用它来创建课程视图(这现在是 Linq to Objects 查询) :

var courses = (from c in db.Courses 
               select new  c.ID, Leturers = c.Leturers.ToList() ).ToList();

var courseViews = from c in courses 
                  select new CourseView()  
                    
                      CourseID = c.ID,  
                      ProfessorName = (from l in c.Leturers   
                                       where l.Is_Professor   
                                       select l.LastName+" "+l.FirstName).FirstOrDefault(),  
                      AssistantNames = (from l in c.Leturers   
                                        where !l.Is_Professor   
                                        select l.LastName+" "+l.FirstName)
                                        .ToList()  
                  ;

【讨论】:

以上是关于LINQ to Entity Framework 多对多与字符串列表的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to Entity Framework 多对多与字符串列表

AD0.NET Entity Framework 4.0 或 Linq-to-SQL

linq to sql、Entity Framework 和 NHibernate 的性能如何?

使用内置 Linq to SQL 驱动程序在 LinqPad 中运行 Entity Framework Core 查询的更简单方法?

使用 linq/Entity Framework 查询多对多关系。代码优先

Entity Framework 4 / POCO - 从哪里开始? [关闭]