linq或lambda查询中的条件问题

时间:2013-11-28 06:42:59

标签: c# sql linq lambda

这是初步查询。

var DevUsers = db.UserProfiles.Include("Tasks").Include("Projects").Include("FollowerTasks").Select(i => new
        {               
            Tasks = db.Tasks.Where(j => j.AssignedToPersonID == i.PersonID).Where(k => k.QAStatus != "Passed").Select(k => new
            {
                k.Projects,
                k.TaskName,
                k.ViewedByDeveloper,
                k.Status,
                k.QAStatus,
                k.ReleaseStatus,
                k.TaskID,
                k.DisplayTaskID,
                k.EstimatedDeliveryDate,
                k.AssignedToPerson.FirstName,
                Tags = k.Tags.Where(p => p.TagType == "General"),
                Modules = k.Tags.Where(p => p.TagType == "Module"),
                CodeTables = db.CodeTables.Where(l => l.Status == k.Status).FirstOrDefault(),
            }).OrderBy(k => k.ViewedByDeveloper).ThenBy(k => k.CodeTables.DisplayOrder).ThenByDescending(k => k.ReleaseStatus),
            i.PersonID,
            i.FirstName,
            i.LastName,
            i.UserID,
            i.EmailAddress,
        }).OrderBy(i => i.FirstName);

我无法在此DevUsers

中执行任何类型的查询
DevUsers = DevUsers.Where(m=>m.PersonID==1);

给出错误“无法转换来源......”

我如何在条件适用的地方申请。我需要在此处适用PersonID(int)Status(int)

2 个答案:

答案 0 :(得分:3)

您的DevUsersIOrderedEnumerable<T>,无法隐式转换为IEnumerable<T>,因此您应该定义一个新变量:

var newDevUsers =  DevUsers.Where(m=>m.PersonID==1);

或使用AsEnumerable()修改上一个查询,如下所示:

//...
}).OrderBy(i => i.FirstName).AsEnumerable();
DevUsers = DevUsers.Where(m=>m.PersonID==1);

答案 1 :(得分:1)

回答你的第二个问题(发表在King King回答的评论中)是:m.Tasks是集合(在这种情况下是IOrderedEnumerable<T>)并且没有Status属性。

如果您希望所有任务都具有给定状态,则应使用DevUsers = DevUsers.Where(m => m.Tasks.All(t => t.Status==1))
如果您希望任何任务具有给定状态,则应使用DevUsers = DevUsers.Where(m => m.Tasks.Any(t => t.Status==1))