无法理解这个IEnumerable <T> .ToArray()示例

mal*_*kan 2 c# linq

在以下几行中,我确实理解LINQ部分,但是当我尝试理解最后一行时,我会完全麻木.

var roles=from r in db.Role
               from u in db.User
               where r.RoleID==u.RoleID
               && u.UserName==username
               select new
                 {
                    RoleNames=r.RoleName
                 };
               return new string[] {roles.ToArray()[0].RoleNames};

变量roles是IEnumerable类型(对吧?),它包含匿名的RoleNames对象集合?最后一行,复杂的赋值给string [] {roles.ToArray()[0].RoleNames}.
,roles转换为数组(OK)然后幻像索引[0](为什么?)然后在最后RoleNames包含的匿名类型roles但是如何成为一个字符串数组.
感谢先进,即使是外观.

Mat*_*eer 6

从这段代码中很难说,但感觉这段代码没有做到作者的意图.

为什么用户有RoleID列?如果用户只能拥有一个角色,那就没问题.但是这段代码似乎意味着用户可以拥有多个角色.用户表是否包含每个用户的多个条目,每个用户分配一个角色?用户/角色通常是多对多的关系.

原作者正在获取该查询的结果,只是获取它的第一个结果(在这种情况下,调用roles.First()可能更合适),然后在那里获取一个角色并将其返回到数组中.如果这个数组只有一个元素,那就没问题,但是感觉不对的男孩.如果作者追求多个角色,他们只会得到一个角色.更不用说如果找不到任何角色,这段代码就会爆炸.

如果用户真的只能拥有一个角色,那么获得该角色的方式就会更简单(也更容易阅读).也许是这样的:

var roles=from r in db.Role
           from u in db.User
           where r.RoleID==u.RoleID
           && u.UserName==username
           select r.RoleName;

 // at this point roles will probably have zero or one entry, so you can do
 return roles.FirstOrDefault(); // return the one role found as a string
     // or null if none were

 // or if you really do want the array
 return roles.ToArray(); // will return a string array,
     // possibly having 1 or 0 elements
Run Code Online (Sandbox Code Playgroud)