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));
           });
看似简单的知识,事实上它困扰了我很长时间,可能也困扰了您很长时间吧,没关系,今天咱们终于把它解决了。
posted @   张占岭  阅读(1080)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示