Linq实体类的设计(解决了复合查询的问题,同时解决了LINQ上下文缓存问题)

文章中解决的问题:1 Linq to SQL不支持返回显示实体问题

2 解决了实体中导航属性为集合时类型转换错误的问题

实体的设计:

/// <summary>
/// Linq原-生ú态类à型í的派é生ú类à,用来′临ù时±保£存结á果集ˉ
/// </summary>
public class WebManageUsers_Ext : WebManageUsers { }

/// <summary>
/// 对Linq原-生ú态类à型í的扩展1
/// </summary>
public partial class WebManageUsers : EntityBase
{
    /// <summary>
    /// 实μ体集ˉ合:o导航属性为a集ˉ合时±,不能ü直±接ó写′为aList,它ü会á有D类à型í转a换错í误ó,必须是IEnumerable接ó口ú类à型í
    /// </summary>
    public IEnumerable<WebManageUser_WebManageRoles> WebManageUser_WebManageRoles_Extend { get; set; }
    /// <summary>
    /// 实μ体
    /// </summary>
    public WebDepartments WebDepartments_Extend { get; set; }
    /// <summary>
    /// 统3一主÷键ü
    /// </summary>
    public override object[] PrimaryKey
    {
        get { return new object[] { this.ManageUserID }; }
    }
    /// <summary>
    /// 建¨立¢类à型í的对象ó时±,自动ˉ执′行D的代ú码逻辑-
    /// </summary>
    partial void OnCreated()
    {

        base.IsRealDeleted = false;//假ù删除y
        base.Initialization();//基ù类à的某3些属性初始化ˉ
        this.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(base.PropertyChangedEvent);//初始实μ体时±,先è订阅列D修T改的事件t
    }
}
而在进行进行复合查询时,我们可以这样来写:
var linq = (from data in iWebManageUsersRepository.GetModel()
                       join data2 in iWebDepartmentsRepository.GetModel() on data.DepartmentID equals data2.DepartmentID
                       join data3 in iWebManageUser_WebManageRolesRepository.GetDetailModel() on data.ManageUserID equals data3.ManageUserID into list
                       select new WebManageUsers_Ext
                       {
                           ManageUserID = data.ManageUserID,
                           LoginName = data.LoginName,
                           Password = data.Password,
                           RealName = data.RealName,
                           Gender = data.Gender,
                           Phone = data.Phone,
                           Mobile = data.Mobile,
                           Email = data.Email,
                           QQ = data.QQ,
                           MSN = data.MSN,
                           Rtx = data.Rtx,
                           Birthday = data.Birthday,
                           Description = data.Description,
                           DepartmentID = data.DepartmentID,
                           CreateDate = data.CreateDate,
                           UpdateDate = data.UpdateDate,
                           Operator = data.Operator,
                           Status = data.Status,
                           WebDepartments_Extend = data2,
                           WebManageUser_WebManageRoles_Extend = list.Cast<WebManageUser_WebManageRoles>(),
                           AvatarUrl = data.AvatarUrl,


                       });
在实体查询时,显式的返回了结果集,这样做的好处就是可以去除LINQ所带来的缓存问题下面是将用户及角色信息输出:
linq.ToList().ForEach(i =>
           {
               if (i.WebManageUser_WebManageRoles_Extend != null && i.WebManageUser_WebManageRoles_Extend.Count() > 0)
                   i.WebManageUser_WebManageRoles_Extend.ToList().ForEach(j => Console.WriteLine(j.WebManageRoles_Extend.RoleName + j.WebManageUsers_Extend.RealName));
           });
看似简单的知识,事实上它困扰了我很长时间,可能也困扰了您很长时间吧,没关系,今天咱们终于把它解决了。
原文地址:https://www.cnblogs.com/lori/p/2473141.html