SqlSugar的导航查询、反向导航查询、导航插入、导航更新

系列文章目录

第1章 SqlSugar-表到实体、实体到表及库表操作
第2章 SqlSugar增删改操作
第3章 SqlSugar查询操作
第4章 SqlSugar导航查询、反向导航查询、导航插入、导航更新

文章目录

  • 系列文章目录
  • 一、实体类配置
  • 二、导航查询
  • 三、反向导航查询
  • 四、导航插入
    • 4.1、一对多
    • 4.2、一对一
  • 五、导航更新

一、实体类配置

四张表成级联关系,由上到下分别为:

  • Patient :包含studyList
  • Study :包含seriesList、包含上一层的Patient
  • Series :包含instanceList、包含上一层的Study
  • Instance:包含上一层的Series

以下实体类仅做导航操作参考使用:

	[SugarTable("Patient")]
    [DataContract]
    public class Patient
    {
        #region Private members
        private int? _id;
        private string _patientId;
        private string _firstName;
        private List<Study> _studyList;
        private DateTime _lastUpdatedDateTime;
        #endregion
        
        #region constructor
        public Patient(string lastName, string firstName, DateTime? dob, enumSex sex)
        {
            _lastName = lastName;
            _firstName = firstName;
            _dob = dob;
            _sex = sex;
        }
        public Patient ()
        {
        }
        #endregion

        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public virtual int? Id
        {
            get { return _id; }
            set { _id = value; }
        }

        [SugarColumn(InsertServerTime = true, UpdateServerTime = true)]
        public virtual DateTime LastUpdatedDateTime
        {
            get { return _lastUpdatedDateTime; }
            set { _lastUpdatedDateTime = value; }
        }

        [DataMember(IsRequired = false, Order = 2)]
        public virtual string PatientId
        {
            get { return _patientId; }
            set { _patientId = value; }
        }

        [SugarColumn(ColumnName = "PatientFirstName")]
        public virtual string FirstName
        {
            get { return _firstName; }
            set { _firstName = value; }
        }

		//导航查询注解
        [Navigate(NavigateType.OneToMany, nameof(Study.PatientDbId))]
        public virtual List<Study> StudyList
        {
            get { return _studyList; }
            set { _studyList = value; }
        }
    }
    [SugarTable("Study")]
    [DataContract]
    public class Study
    {
        #region Private Members
        private int? _id; // Study Db Id
        private int? _patientDbId; // Patient Db Id
        private Patient _pateint;
        private string _studyInstanceUid;
        private string _studyId;
        private string _studyDescription;
        private List<Series> _seriesList;
        #endregion Private Members

        #region Constructor
        public Study(int? dbId, int? patDbId, string studyUid)
        {
            _id = dbId;
            _patientDbId = patDbId;
            _studyInstanceUid = studyUid;
        }

        public Study()
        {
        }

        #endregion Constructor

        #region Properties
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public virtual  int? Id
        {
            get { return _id; }
            set { _id = value; }
        }

        [SugarColumn(IsIgnore = true)]
        public virtual  int? DbId
        {
            get { return Id; }
        }

        [SugarColumn(ColumnName = "PatId")]
        public virtual  int? PatientDbId
        {
            get { return  _patientDbId; }
            set { _patientDbId = value; }
        }
        //反向导航查询注解
        [Navigate(NavigateType.ManyToOne, nameof(PatientDbId))]
        public virtual  Patient Patient
        {
            get { return _pateint; }
            set { _pateint = value;
                _patientDbId = _pateint.Id;
            }
        }

        [SugarColumn(ColumnName = "StudyInstanceUid")]
        public virtual  string StudyUid
        {
            get { return _studyInstanceUid; }
            set { _studyInstanceUid = value; }
        }

        public virtual string StudyId
        {
            get { return _studyId; }
            set { _studyId = value; }
        }
        [Navigate(NavigateType.OneToMany, nameof(Series.StudyDbId))]
        public virtual List<Series> SeriesList
        {
            get { return _seriesList; }
            set { _seriesList = value; }
        }
        #endregion Properties
    }
	[SugarTable("Series")]
    public class Series
    {
        #region Private Members
        private int? _studyDbId;
        private int? _id;
        private string _seriesInstanceUid;
        private string _studyInstanceUid;
        private StatusEnum _status;
        private Study _study;
        private List<Instance> _instanceList;
        private double? _fileSizeInMB;
        #endregion Private Members

        #region Constructor
        public Series()
        {
            _fileSizeInMB = 0.0;
            _numberOfImages = 0;
        }
        #endregion Constructor

        #region Properties
        [SugarColumn(ColumnName = "StudyId")]
        public virtual int? StudyDbId
        {
            get { return _studyDbId; }
            set { _studyDbId = value; }
        }

        [SugarColumn(IsIgnore = true)]
        public virtual int? SeriesDbId
        {
            get { return Id; }
        }

        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        [Id(Name = "Id")]
        [Generator(1, Class = "identity")]
        public virtual int? Id
        {
            get { return _id; }
            set { _id = value; }
        }

        [Navigate(NavigateType.ManyToOne, nameof(StudyDbId))]
        public virtual Study Study
        {
            get { return _study; }
            set { _study = value;
                _studyDbId = _study.Id;
            }
        }

        [SugarColumn(ColumnName = "SeriesInstanceUid")]
        public virtual string SeriesUid
        {
            get { return _seriesInstanceUid; }
            set { _seriesInstanceUid = value; }
        }

        [SugarColumn(ColumnName = "StudyInstanceUid")]
        public virtual string StudyUid
        {
            get { return _studyInstanceUid; }
            set { _studyInstanceUid = value; }
        }

        public virtual string PatientId { get; set; }

        [Navigate(NavigateType.OneToMany, nameof(Instance.SeriesId))]
        public virtual List<Instance> InstanceList
        {
            get { return _instanceList; }
            set { _instanceList = value; }
        }
        #endregion Properties
    }
    [SugarTable("Instance")]
    public class Instance
    {
        #region private members
        private int? _id;
        private Series _series;
        private string _seriesInstacneUid;
        private string _fileName;
        private int? _seriesId;
        #endregion private members 

        #region Properties
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public virtual int? Id
        {
            get { return _id; }
            set { _id = value; }
        }

        [Navigate(NavigateType.ManyToOne, nameof(SeriesId))]
        public virtual Series Series
        {
            get { return _series; }
            set { _series = value; }
        }

        [SugarColumn(ColumnName = "SeriesId")]
        public virtual int? SeriesId
        {
            get { return _seriesId; }
            set { _seriesId = value; }
        }

        public virtual string SeriesInstanceUid
        { 
            get{ return _seriesInstacneUid ; }
            set { _seriesInstacneUid = value;  }
        }

  }

sqlsugar的SqlSugarClient:

    public class Config
    {
        /// 
        /// Return SqlSugar DBContext DB Instance
        /// 
        /// 
        public static SqlSugarClient GetClient()
        {
            var db = new SqlSugarClient(new ConnectionConfig()
            {
                ConnectionString = @"xxxxxxxxx",
                DbType = DbType.SqlServer,
                InitKeyType = InitKeyType.Attribute,
                IsAutoCloseConnection = true
            },

二、导航查询

//patient导航查询,包含下面三层:StudyList》SeriesList》InstanceList
IList<Patient> list = Config.GetClient().Queryable<Patient>()
			           .Includes(p => p.StudyList,st=>st.SeriesList,se=>se.InstanceList)
			           .ToList();
//study导航查询,包含下面两层:SeriesList》InstanceList
var list1 = Config.GetClient().Queryable<Study>()
            .Includes(x => x.SeriesList,se=>se.InstanceList)
            .ToList();
//series导航查询,包含下面一层:InstanceList
var list2 = Config.GetClient().Queryable<Series>()
            .Includes(se => se.InstanceList)
            .ToList();

三、反向导航查询

//反向查询,study查patient
var studylist = Config.GetClient().Queryable<Study>()
                .Includes(x => x.Patient)
                .where(x=>x.Id==1)//可以配合where
                .ToList();
//反向查询,series查study》patient
var serieslist = Config.GetClient().Queryable<Series>()
                .Includes(x => x.Study,y=>y.Patient)
                .ToList();
//反向查询,instance查series查study查patient
var instancelist = Config.GetClient().Queryable<Instance>()
	                .Includes(z=>z.Series,x => x.Study, y => y.Patient)
	                .ToList();

四、导航插入

4.1、一对多

同时插入study及其包含的SeriesList,以及每个series中包含的InstanceList

Config.GetClient().InsertNav(study)
                  .Include(z1 => z1.SeriesList)
                  .ThenInclude(z1 => z1.InstanceList)
                  .ExecuteCommand();

4.2、一对一

  • A实体类包含B实体类的这种属性,在B属性上添加注解[Navigate(NavigateType.OneToOne, nameof(B.Id))]

  • B实体类

同时插入A及对应的B:

Config.GetClient().InsertNav(List<A>)
				  .Include(z1 => z1.B)
				  .ExecuteCommand();

五、导航更新

var List<Study> list=new List<Study>(){....};
Config.GetClient().UpdateNav(list)
	              .Include(z1 => z1.SeriesList)
	              .ExecuteCommand();


Config.GetClient().UpdateNav(list)
    .Include(z1 => z1.SeriesList).ThenInclude(z1 => z1.InstanceList)//更新2层 
    .Include(z1 => z1.xxxList)//更新其他第1层
    .ExecuteCommand();

你可能感兴趣的:(#,SqlSugar,数据库,c#,sql)