Linq到实体-获取所有角色的用户信息

Linq到实体-获取所有角色的用户信息,linq,entity-framework-4,linq-to-entities,asp.net-membership,entity-relationship,Linq,Entity Framework 4,Linq To Entities,Asp.net Membership,Entity Relationship,我是Linq的新手,正在用一个新的MVC站点进行测试。我仍在努力学习语法和功能,遇到了一个我无法解决的问题。任何协助都将不胜感激 情况: 1-我有一个SQL数据库设置,可以使用默认的ASPNET成员资格提供程序。标准命名约定仍然存在(aspnet_用户、aspnet_角色、aspnet_用户角色) 2-我添加了一个名为Users的表,它提供扩展的用户信息。FK是aspnet_用户用户ID(一对一) 3-我添加了一个名为Customers的表,该表提供客户(订购)信息。FK是用户表中的用户ID(一

我是Linq的新手,正在用一个新的MVC站点进行测试。我仍在努力学习语法和功能,遇到了一个我无法解决的问题。任何协助都将不胜感激

情况:

1-我有一个SQL数据库设置,可以使用默认的ASPNET成员资格提供程序。标准命名约定仍然存在(aspnet_用户、aspnet_角色、aspnet_用户角色)

2-我添加了一个名为Users的表,它提供扩展的用户信息。FK是aspnet_用户用户ID(一对一)

3-我添加了一个名为Customers的表,该表提供客户(订购)信息。FK是用户表中的用户ID(一对一)

4-我添加了一个名为CustomerAddress的表格,它提供客户地址信息。FK是Customers表中的CustomerId(一对多)

5-我已经建立了一个模型来处理向管理员展示这些信息

问题:

1-我希望在此演示模型中包含应用程序中可用的所有角色的列表,以及用户当前是否分配给该角色

2-我想在这个演示模型中包括一个与用户相关的所有地址的列表

3-我不知道如何使用Linq查询将此信息返回到演示模型

这是我的演示模型(请注意,我目前有一个角色属性,但我还没有弄清楚如何获取这些信息。而且…我不确定应该是什么类型

namespace Lambuth.PresentationModels.ManageUsers
{
public class UserDetail
{
[Editable(false)]
[Key, ScaffoldColumn(false)]
[Display(Name="User ID")]
public Guid UserId { get; set; }

[Required]
[Editable(false)]
[StringLength(16)]
[Display(Name="User Name")]
public string UserName { get; set; }

[Editable(false)]
[ScaffoldColumn(false)]
[StringLength(16)]
[Display(Name = "Lowered User Name")]
public string LoweredUserName { get; set; }

[Required]
[Editable(false)]
[StringLength(256)]
[Display(Name = "Email")]
public string Email { get; set; }

[Editable(false)]
[ScaffoldColumn(false)]
[StringLength(256)]
[Display(Name = "Lowered Email")]
public string LoweredEmail { get; set; }

[Editable(false)]
[StringLength(16)]
[Display(Name = "Site Alias")]
public string SiteAlias { get; set; }

[Required]
[Editable(false)]
[Display(Name = "Is Approved")]
public bool IsApproved { get; set; }

[Required]
[Editable(false)]
[Display(Name = "Is Locked Out")]
public bool IsLockedOut { get; set; }

[Editable(false)]
[Display(Name = "Join Date")]
public DateTime JoinDate { get; set; }

[Editable(false)]
[Display(Name = "Full Name")]
public string FullName
{
  get
  {
    AccountInfoHelpers help = new AccountInfoHelpers();
    return help.GetFullName(this.Salutation, this.FirstName, this.LastName);
  }
  set {/*no implmentation*/}
}

[Editable(false)]
[StringLength(20)]
[Display(Name = "Salutation")]
public string Salutation { get; set; }

[Editable(false)]
[StringLength(50)]
[Display(Name = "First Name")]
public string FirstName { get; set; }

[Editable(false)]
[StringLength(50)]
[Display(Name = "Last Name")]
public string LastName { get; set; }

[Editable(false)]
[Display(Name = "Last Login Date")]
public DateTime LastLoginDate { get; set; }

[Editable(false)]
[Display(Name = "Assigned Roles")]
public virtual ICollection<UserRole> AssignedRoles { get; set; }
我在这方面做得对吗?如果有任何建议,我们将不胜感激


谢谢。

我会使用稍微不同的Linq语句。虽然LinqToSql可以用于生成SQL语句,并且能够看起来像SQL语句(如您在示例中所看到的),但我倾向于从生成对象的角度使用它们

我的意思是,我没有亲自处理表之间的连接,而是利用LinqToSql生成器已经完成的工作并使用它们的对象。业务对象已经具有链接到相关对象的属性

以下是我将如何做您的linq声明:

var user = (from u in context.aspnet_Users
            where (ux.user_id == userId)  //userId passed in as param
            select new UserDetail
            {
              UserId = u.user_id,
              UserName = u.UserName,
              SiteAlias = u.User.site_alias,
              Email = u.aspnet_Membership.Email,
              Salutation = u.User.Customer.salutation,
              FirstName = u.User.Customer.first_name,
              LastName = u.User.Customer.last_name,
              LastLoginDate = u.aspnet_Membership.LastLoginDate,
              IsApproved = u.aspnet_Membership.IsApproved,
              IsLockedOut = u.aspnet_Membership.IsLockedOut,
              AssignedRoles = u.aspnet_Roles.Select(r => r.RoleName).ToList()
            }).Single();
我不确定UserRole类是什么样子的,所以我现在只有一组字符串。另外,由于没有您拥有的特定SQL方案(您设置的属性),我正在偏离您对对象关系的描述


另外,在处理从多个表中提取数据的LinqToSQL语句时,您希望确保进行的数据库调用尽可能少。如果不这样做,您可能会遇到一个。帮助处理此问题的一种方法是在LinqToSQL中。

我将使用稍微不同的Linq语句。而LinqToSQL可用于生成SQL语句,并且能够看起来像SQL语句(正如您在示例中看到的),我倾向于从生成对象的角度使用它们

我的意思是,我没有亲自处理表之间的连接,而是利用LinqToSql生成器已经完成的工作并使用它们的对象。业务对象已经具有链接到相关对象的属性

以下是我将如何做您的linq声明:

var user = (from u in context.aspnet_Users
            where (ux.user_id == userId)  //userId passed in as param
            select new UserDetail
            {
              UserId = u.user_id,
              UserName = u.UserName,
              SiteAlias = u.User.site_alias,
              Email = u.aspnet_Membership.Email,
              Salutation = u.User.Customer.salutation,
              FirstName = u.User.Customer.first_name,
              LastName = u.User.Customer.last_name,
              LastLoginDate = u.aspnet_Membership.LastLoginDate,
              IsApproved = u.aspnet_Membership.IsApproved,
              IsLockedOut = u.aspnet_Membership.IsLockedOut,
              AssignedRoles = u.aspnet_Roles.Select(r => r.RoleName).ToList()
            }).Single();
我不确定UserRole类是什么样子的,所以我现在只有一组字符串。另外,由于没有您拥有的特定SQL方案(您设置的属性),我正在偏离您对对象关系的描述


另外,在处理从多个表中提取数据的LinqToSQL语句时,您希望确保进行的数据库调用尽可能少。如果不这样做,您可能会遇到一个。帮助处理此问题的一种方法是在LinqToSQL中。

您的
.Single()
应该类似于
.Single>(a=>a.UserId==200
)。否则,您将返回一个具有多个用户的查询和对
.Single()的调用
将引发异常。Hi Kittoes-感谢您的回复。我添加了一条说明,指示用户ID作为参数传入。它只返回该特定GUID的记录。这很好…但我希望返回与特定用户关联的所有角色和地址。只要将业务逻辑和ASP.Net成员身份这看起来不错,请参阅。谢谢Gert。但这并不能回答我的问题。我的实体模型中已经内置了成员身份表。这更像是一个特定的Linq问题:如何在Linq查询中获取系统角色集合、用户是否处于该角色以及客户地址集合。您的
。Single()
应该类似于
.Single(a=>a.UserId==200
)。否则,您将返回多个用户的查询和对
.Single()的调用
将引发异常。Hi Kittoes-感谢您的回复。我添加了一条说明,指示用户ID作为参数传入。它只返回该特定GUID的记录。这很好…但我希望返回与特定用户关联的所有角色和地址。只要将业务逻辑和ASP.Net成员身份这看起来不错,请参阅。谢谢Gert。但这并不能回答我的问题。我的实体模型中已经内置了成员身份表。这更像是一个特定的Linq问题:如何在Linq查询中获取系统角色集合、用户是否处于该角色以及客户地址集合。谢谢SBurr是的。我知道这已经晚了很多年,但是我从来没有看到你的回复。谢谢你花时间,我也很抱歉从来没有看到这个。干杯。谢谢斯伯里斯。我知道这已经晚了很多年,但是我从来没有看到你的回复。谢谢你花时间,我也很抱歉从来没有看到这个。干杯。