我遇到一些代码无法在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;)'的类型参数。尝试明确指定类型参数。
答案 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)发生之前和之后都有一个值,所以我认为编译器优化/调试在这里发挥作用。
希望这有助于其他人:)