Linq到生成大查询的实体

Linq到生成大查询的实体,linq,entity-framework,linq-to-entities,Linq,Entity Framework,Linq To Entities,我一直在跟踪Linq生成的一些查询,它们看起来非常不优化和笨拙 我意识到您不知道我的数据结构,但是下面的linq查询有什么问题吗 IQueryable<Tasks> tl = db.Tasks .Include("Catagories") .Include("Projects") .In

我一直在跟踪Linq生成的一些查询,它们看起来非常不优化和笨拙

我意识到您不知道我的数据结构,但是下面的linq查询有什么问题吗

    IQueryable<Tasks> tl = db.Tasks
                                .Include("Catagories")
                                .Include("Projects")
                                .Include("TaskStatuses")
                                .Include("AssignedTo")
                                .Where
                                    (t => (t.TaskStatuses.TaskStatusId.Equals(currentStatus) | currentStatus == -1) &
                                    (t.Projects.ProjectId.Equals(projectId) | projectId == -1) &
                                    (t.Subject.Contains(SearchText) | t.Description.Contains(SearchText) | SearchText == "" | SearchText == null) &
                                    (t.Projects.Active == true) & 
                                    (t.Catagories.Active == true || t.Catagories==null) &
                                    (t.LoggedBy.UserProfile.Companies.CompanyId == CompanyId) &
                                    (assignedToGuid == rnd | t.AssignedTo.UserId.Equals(assignedToGuid))).OrderBy(SortField + " " + SortOrder);
我相信一定有办法让Linq生成更友好的SQL。如果我写了这个相同的查询,它可以在大约5个连接中完成,并且没有内部选择,那么有可能让Linq来整理它吗

谢谢


Gavin

LINQ to EF创建的大型查询只是Entity框架第一个版本的一个缺点。但是,您的查询包含短语.OrderBy(SortField+“”+SortOrder),我认为首选的编写方法是.OrderBy(SortField).ThenBy(SortOrder)。还有,在某些地方,您使用|而不是| |和&而不是&&有什么原因吗

IQueryable<Tasks> tl = db.Tasks
                                .Include("Catagories")
                                .Include("Projects")
                                .Include("TaskStatuses")
                                .Include("AssignedTo")
                                .Where
                                    (t => (t.TaskStatuses.TaskStatusId.Equals(currentStatus) | currentStatus == -1) &
                                    (t.Projects.ProjectId.Equals(projectId) | projectId == -1) &
                                    (t.Subject.Contains(SearchText) | t.Description.Contains(SearchText) | SearchText == "" | SearchText == null) &
                                    (t.Projects.Active == true) & 
                                    (t.Catagories.Active == true || t.Catagories==null) &
                                    (t.LoggedBy.UserProfile.Companies.CompanyId == CompanyId) &
                                    (assignedToGuid == rnd | t.AssignedTo.UserId.Equals(assignedToGuid))).OrderBy(SortField + " " + SortOrder);
IQueryable tl=db.Tasks
.包括(“类别”)
.包括(“项目”)
.包括(“任务状态”)
.包括(“转让给”)
哪里
(t=>(t.TaskStatuses.TaskStatusId.Equals(currentStatus)| currentStatus==-1)&
(t.Projects.ProjectId.Equals(ProjectId)| ProjectId==-1)&
(t.Subject.Contains(SearchText)| t.Description.Contains(SearchText)| SearchText==“”| SearchText==null)&
(t.Projects.Active==true)和
(t.Catagories.Active==true | | t.Catagories==null)&
(t.LoggedBy.UserProfile.companys.CompanyId==CompanyId)&
(assignedToGuid==rnd | t.AssignedTo.UserId.Equals(assignedToGuid)).OrderBy(SortField+“”+SortOrder);

可以肯定地说,这不仅仅是第一个版本的一个缺点。
IQueryable<Tasks> tl = db.Tasks
                                .Include("Catagories")
                                .Include("Projects")
                                .Include("TaskStatuses")
                                .Include("AssignedTo")
                                .Where
                                    (t => (t.TaskStatuses.TaskStatusId.Equals(currentStatus) | currentStatus == -1) &
                                    (t.Projects.ProjectId.Equals(projectId) | projectId == -1) &
                                    (t.Subject.Contains(SearchText) | t.Description.Contains(SearchText) | SearchText == "" | SearchText == null) &
                                    (t.Projects.Active == true) & 
                                    (t.Catagories.Active == true || t.Catagories==null) &
                                    (t.LoggedBy.UserProfile.Companies.CompanyId == CompanyId) &
                                    (assignedToGuid == rnd | t.AssignedTo.UserId.Equals(assignedToGuid))).OrderBy(SortField + " " + SortOrder);