使用Linq从链接表中获取用户名

时间:2014-10-15 07:46:52

标签: c# asp.net linq

我有一个名为tblAuditRecord的表,其中一个字段将登录的用户ID记录为审计员。现在,当检索要查看的记录时,我想要检索完成审核的实际用户名而不是用户ID。我在查看单个审计记录时已经成功地设法完成了这项工作,但是我很难将其用于检索审计列表。

var tblauditrecord = db.tblAuditRecords.OrderByDescending(e => e.dateOfAudit)

上面的代码行当前返回审计列表(在代码的返回视图行添加了tolist扩展方法。

任何人都可以建议如何通过将AuditorID与UserId相匹配来获取UserProfile表来获取UserName。

我尝试使用.include作为下面的代码

var tblauditrecord = db.tblAuditRecords.Include(e => e.UserProfileGetUsername);

但出现错误"类型' System.Reflection.TargetInvocationException'发生在mscorlib.dll中但未在用户代码中处理"它从这行代码

指向InitialiseSimplemembershipAttribute.cs文件
LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);

如果有人能提供解决方案,那就太棒了(我打赌我这让它变得比它需要的更复杂)

下面添加的表格模型代码

    [Table("tblAuditRecord")]
    public class tblAuditRecord
    {

        [Key]
        public int auditId { get; set; }

        [Column(TypeName = "datetime2")]
        public DateTime dateOfAudit { get; set; }

        [StringLength(50)]
        public string fleetNumber { get; set; }

        [StringLength(50)]
        public string nonFleetNumber { get; set; }

        //public string auditType { get; set; }  check about this one
        [StringLength(200)]
        public string bodyShopName { get; set; }

        [StringLength(20)]
        public string vehicleReg { get; set; }

        [StringLength(30)]
        public string vehicleMake { get; set; }

        [StringLength(50)]
        public string vehicleModel { get; set; }

        [StringLength(150)]
        public string vehicleAdditionalDetail { get; set; }

        public int numberOfDoors { get; set; }

        [StringLength(20)]
        public string vehicleMileage { get; set; }

        public int auditorID { get; set; }
        [ForeignKey("UserId")]
        public virtual UserProfile UserProfileGetUsername { get; set; }

        public string auditorSignature { get; set; }

        [Column(TypeName = "datetime2")]
        public Nullable<DateTime> dateOfSignature { get; set; }

        public bool machinePolished { get; set; }

        public bool vehicleDriven { get; set; }

        public string bodyShopContactName { get; set; }

        public string bodyShopSignature { get; set; }

        [Column(TypeName = "datetime2")]
        public Nullable<DateTime> dateOfBodyShopSignature { get; set; }

        public string additionalInformation { get; set; }

        [Required]
        [Display(Name = "Email Address")]
        public string EmailAddress { get; set; }

        public virtual ICollection<tblDamageLine> tblDamageLines { get; set; }



    }

用户个人资料表

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
}

3 个答案:

答案 0 :(得分:0)

  

var query =来自u的userprofiles             加入审计u.UserID等于a.auditorID             选择u.UserName;

我不知道UserProfile的字段,因此如果您使用与tblAuditRecord中相同的命名方案,它们可能是.userID。 UserProfile也可以是tblUserProfile。

此代码需要2个变量,一个类型为UserProfile(userprofiles),另一个为tblAuditRecord(审计),每个类都包含整个表。然后根据匹配的ID执行内部联接,并从结果表中检索所需的值(用户名)。

答案 1 :(得分:0)

您没有太多选择,这取决于您对结果的期望:

var query = FROM
  u IN userprofiles 
  JOIN
  a in audits
  ON 
  u.UserID EQUALS a.auditorID 
  SELECT
  u.UserName,
  a.dateOfAudit,
  a.fleetNumber ,
  a.nonFleetNumber ,
  a.auditType, 
  a.bodyShopName,
  ...,
  ;

答案 2 :(得分:0)

我通过在我的控制器类中使用.include找到了解决方案

var tblauditrecord = db.tblAuditRecords.Include(e => e.UserProfileGetUsername);

并在我的审计表模型中添加了以下内容

        public int auditorID { get; set; }
        [ForeignKey("auditorID")]
        public virtual UserProfile UserProfileGetUsername { get; set; }

在我的剃刀视图中,我随后调用了用户名:

@Html.DisplayFor(modelItem => item.UserProfileGetUsername.UserName)