【发布时间】:2013-09-28 10:48:34
【问题描述】:
我遇到了一些无法在 LINQ 中运行的代码的问题,但它确实可以作为简单的 for..each 运行。任何解释和解决方案将不胜感激。
我有 3 个类,用户、用户、用户权限组成如下:
班级用户
ObservableCollection<User> GetList
班级用户
Public int id {get;set;}
Public string UserName {get;set;}
Public UserPermissions Permissions {get;set;}
类用户权限
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 '应该' 做同样的事情,但事实并非如此。输出窗口中没有返回或引发错误,并且 muser 变量在跨过它之后根本不存在。我尝试在我的演员表中更具体并使用 AsQueryable。我什至尝试使用两个 from 命令让 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 => u.Permissions);
错误 1 无法从用法中推断方法“System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable, System.Func>)”的类型参数。尝试明确指定类型参数。
【问题讨论】:
-
musers在你迭代它之前不会有任何东西(许多 linq 方法被推迟到你迭代可枚举的点)。试试var id = musers.FirstOrDefault();,如果枚举为空,这将返回default(T)。如果你想测试空,试试if (musers.Any()) { }。 -
扩展方法?例如:UserList.Where(x=>x.UserName == userName && x.Permissions.ApplicationID == ApplicationId).Select(x=>x);或 UserList.Select(x=>x.UserName == userName && x.Permissions.ApplicationID == ApplicationId)
-
已经试过这个亚历克斯,复制并粘贴你的例子,结果和我的代码一样,我害怕。但感谢您的尝试。
-
@AlexDenysenko 查询语法被编译成那个,虽然你刚刚写的代码不是很正确,但如果它是正确的,使用该语法不会发生任何变化。跨度>
-
@user1284624 在列表名称后添加
AsEnumerable。目前,您的“工作”代码示例正在应用程序端执行所有过滤,linq 示例正在使用查询提供程序在它到达之前执行它,这可能有问题。如果使用AsEnumerable有效,则可能意味着查询提供程序无法将表达式转换为查询。您在这里使用什么查询提供程序?