C#中List<T> 泛型中查询数据和设置值

一般情况下List中的T,都是已知的对象(即给定的对象)。所以使用.Select .FirstOrDefault查询起来很方便。网上也有很多这样的栗子。

我碰到的问题就是泛型对象中查询和设置值。网上没搜到查询方法。就自己写了个处理方式。

1. 在UtilConvert类中定义了2个方法:

public static class UtilConvert
{
        /// 
        /// 获取对象字段的值
        /// 
        /// 
        /// 
        /// 
        public static string ObjGetFieldValue(this object obj,string fieldID)
        {
            Type type = obj.GetType();
            PropertyInfo[] propertyInfos = type.GetProperties();
            foreach (PropertyInfo item in propertyInfos)
            {
                if (item.Name.ToUpper() == fieldID.ToUpper())
                    return (item.GetValue(obj, null) == null ? "" : item.GetValue(obj, null)).ToString();
            }
            return "";
        }

        /// 
        /// 设置对象字段的值
        /// 
        /// Class对象
        /// 字段
        /// 值
        /// 
        public static bool ObjSetFieldValue(this object obj, string fieldID,string value)
        {
            Type type = obj.GetType();
            PropertyInfo[] propertyInfos = type.GetProperties();
            foreach (PropertyInfo item in propertyInfos)
            {
                if (item.Name.ToUpper() == fieldID.ToUpper())
                {
                    item.SetValue(obj, string.IsNullOrEmpty(value) ? null : Convert.ChangeType(value, item.PropertyType), null);
                    return true;
                }
            }
            return false;
        }
}

2. 具体的实现方法:

       #region 同步SFA数据
        /// 
        /// 同步SFA数据
        /// 
        /// 
        /// 
        /// 
        private async Task AsyncSFADate(string sql) where T : class, new()
        {
            try
            {
                SFARequestHelper sfaHelper = new SFARequestHelper();

                //最后修改日期
                string LastModifiedDate = "2022-05-01T07:37:50.000+0000";
                var list_temp = await _dal.Query("SEP_MSSQL_SFA_BK", "select * from " + typeof(T).Name);
                if (list_temp != null && list_temp.Count > 0)
                    LastModifiedDate = list_temp.Max(o => o.ObjGetFieldValue("LastModifiedDate"));

                if (!sql.ToUpper().Contains(" WHERE"))
                    sql = sql + " WHERE LastModifiedDate>=" + LastModifiedDate;
                else
                    sql = sql + " and LastModifiedDate>=" + LastModifiedDate;
                sql = sql + " order by LastModifiedDate  ";

                var ContractList = await sfaHelper.QueryDataList(sql);
                if (ContractList.Count > 0)
                {
                    var IDs = ContractList.Select(o => o.ObjGetFieldValue("Id")).ToList();

                    _unitOfWork.BeginTran();

                    var list = await _dal.Query("SEP_MSSQL_SFA_BK", "select * from " + typeof(T).Name + " where Id in (" + IDs.ListToString(true) + ")");
                    //var list = await _dal.Query(o => IDs.Contains(o.ObjGetFieldValue("Id"))); //拉姆达不支持函数:ObjGetFieldValue
                    //数据同步到OA
                    List insertList = new List();  //新增
                    List updateList = new List();  //更新

                    foreach (var item in ContractList)
                    {
                        var info = list.FirstOrDefault(o => o.ObjGetFieldValue("Id").ToUpper() == item.ObjGetFieldValue("Id").Trim().ToUpper());
                        if (info == null)
                        {
                            //新增数据
                            info = new T();
                            ModelMapHelper.GetModelMerge(item, info);
                            info.ObjSetFieldValue("AutoID", "0");
                            info.ObjSetFieldValue("IsDelete", ((int)AppEnum.YNStatus.No).ToString());
                            info.ObjSetFieldValue("CreateTime", DateTime.Now.ToString(AppConst.FormateDateTime));

                            insertList.Add(info);
                        }
                        else
                        {
                            //更新数据
                            if (item.ObjGetFieldValue("IsDelete") == ((int)AppEnum.YNStatus.No).ToString())
                            {
                                info.ObjSetFieldValue("AutoID", item.ObjGetFieldValue("AutoID"));
                                info.ObjSetFieldValue("IsDelete", item.ObjGetFieldValue("IsDelete"));
                                info.ObjSetFieldValue("CreateTime", item.ObjGetFieldValue("CreateTime"));
                                info.ObjSetFieldValue("UpdateTime", DateTime.Now.ToString(AppConst.FormateDateTime));
                                ModelMapHelper.GetModelMerge(item, info);
                                updateList.Add(info);
                            }
                        }
                    }

                    if (insertList.Count > 0)
                        await _dal.Add(insertList);
                    if (updateList.Count > 0)
                        await _dal.Update(updateList);
                    _unitOfWork.CommitTran();
                }

                return true;
            }
            catch (Exception exp)
            {
                _logger.LogError(exp, "对象:" + typeof(T).Name + " Error:" + exp.Message);
            }
            _unitOfWork.RollbackTran();
            return false;

        }
        #endregion

说明下,我是在Salesforce的同步中实现的,主要是把Salesforce中数据定时同步到下来。

SFARequestHelper是辅助类,这里不详讲了。

主要是这里使用方式:

C#中List<T> 泛型中查询数据和设置值_第1张图片

  注意拉姆达不支持。

你可能感兴趣的:(C#,.Net,Core,c#,开发语言)