LINQ查询请帮忙,每个作品?

时间:2013-09-23 13:47:40

标签: c# linq .net-3.5

我遇到一些代码无法在LINQ中运行的问题,但它确实可以作为一个简单的for..each工作。任何解释和解决方案都将不胜感激。

我有3个类,Users,User,UserPermissions组成如下:

类用户

ObservableCollection<User> GetList

班级用户

Public int id  {get;set;}
Public string UserName  {get;set;}
Public UserPermissions Permissions {get;set;}

类UserPermissions

Public Int ID {get;set;}
Public int ApplicationID {get;set;}

这适用于并返回正确的用户:

Users users = new Users();
foreach (User u in users.GetList() )
{
    if (u.UserName==username && u.Permissions.ApplicationID == applicationId)
    {
        usr = u;
        break;
    }
}

下面的linq'应该'做同样的事情,但事实并非如此。在输出窗口中没有返回或引发错误,并且在遍历它之后,musers变量根本不存在。我已经尝试在我的演员表中更具体,并使用AsQueryable。我甚至试过让p = u.Permissions,使用两个来自命令,但似乎没有什么能解决它。

我担心的是,由于使用了更复杂的查询,我的其他课程将受此影响并在以后导致问题。

var  musers = from Users.User u in UsersList
               where (u.UserName==userName) 
                       && (u.Permissions.ApplicationID == ApplicationId)
              select u.ID;

以下错误还有一点信息?

var t1 = UsersList.SelectMany(u =&gt; u.Permissions);

错误1无法从用法推断出方法'System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable,System.Func&gt;)'的类型参数。尝试明确指定类型参数。

2 个答案:

答案 0 :(得分:2)

        var usr = users.GetList()
            .FirstOrDefault(
                p => p.UserName == username 
                    && p.Permissions.ApplicationID == applicationId);

实际上应该为你做。如果没有找到用户,FirstOrDefault可以返回null ...

答案 1 :(得分:0)

亚当很感谢亚当。

我在调试器中看到'var found = from ...'表明找到了found并且在运行linq语句的位置包含了一个值。但是,正如Adam正确地指出linq枚举被推迟到您枚举查询的那一点。这一切对我来说很好的原因是直接在代码下工作的是一个for循环触发了这个linq查询的枚举。它上面的其他人没有这样的枚举,只是看起来好像他们默默地失败了!

我认为编译器正在优化函数,以便我可以在代码中调试linq查询而不是枚举发生的地方,好的技巧但它完全错误了我的脚!大声笑。它使我认为即使在使用ToList(),Count()或其他枚举函数之前结果不可用,查询本身也会在某种程度上得到评估。

例如在下面的代码中,只有f3将包含任何内容,其他的只是,嗯,没有,因为它们永远不会被枚举!

var f1 = from .....;

var f2 = from ....;

var f3 = from ....;

做很多其他事情,甚至调用函数

int count = f3.Count();

有趣的是f1,f2甚至在行运行之后都没有,但是f3在枚举(Count)发生之前和之后都有一个值,所以我认为编译器优化/调试在这里发挥作用。

希望这有助于其他人:)