Чтение атрибутов данных или пользовательских атрибутов на сервере SQL из строки - PullRequest
0 голосов
/ 31 октября 2019

Я хочу в SQL подготовленный динамический query на основе shortcode.

Например,

DECLARE @ShortCode VARCHAR(MAX)
SET @ShortCode = '[User data="Name" data="MobileNumber"]';

User = table name
Name = User table field
MobileNumber = User table field

Query output be like
SELECT [Name],[MobileNumber] FROM [dbo].[User]

SET @ShortCode = '[Country data="Name" ID="1"]';

Country = table name
Name = Country table field
ID = User table field

Query output be like
SELECT [Name] FROM [dbo].[Country] WHERE [ID] = 1

Как извлечь все значения data attributes и как получить User в []

Эта функция сделана в C#

Здесь My c # code

// Model class
    public class ShortCodeResult
    {
        public Guid? ID { get; set; }
        public string TableName { get; set; }
        public bool IsValidShortCode { get; set; }
        public string Message { get; set; }
        public Dictionary<string,object> KeyValue { get; set; }
        public ShortCodeResult() {
            KeyValue = new Dictionary<string, object>();
            ID = Guid.NewGuid();
        }
    }

//Regex Filter
    public class RegexFilter
    {
        private string oPattern = @"(\w+)=[\""]([a-zA-Z0-9_.:\""]+)";
        public ShortCodeResult GetShortCodeValues(string Code)
        {
            var oShortCodeModel = new ShortCodeResult();
            var oRegex = new Regex(oPattern, RegexOptions.IgnoreCase);
            var oTableNameRegex = Regex.Match(Code, @"\b[A-Za-z]+\b", RegexOptions.Singleline).Value;
            var lstMatchCollection = oRegex.Matches(Code).Cast<Match>().Where(x=>x.Value.StartsWith("data")).ToList();
            if (lstMatchCollection != null && lstMatchCollection.Count > 0)
            {
                for (int i = 0; i < lstMatchCollection.Count; i++)
                {
                    var oSelected = new Regex("[^=]+$").Match(Convert.ToString(lstMatchCollection[i]));
                    if (oSelected != null)
                    {
                        oShortCodeModel.KeyValue.Add(i.ToString(), oSelected.Value.Trim('"'));
                    }
                }
            }
            oShortCodeModel.TableName = oTableNameRegex;
            return oShortCodeModel;
        }
    }

//HtmlHelper Extension

        public static MvcHtmlString RenderShortCode(this HtmlHelper htmlHelper, string IdOrExprssion)
        {
            #region Get short code data
            var oShortCode = ShortCodeHelper.GetShortCode(IdOrExprssion);
            #endregion
            var oMvcHtmlString = new MvcHtmlString(IdOrExprssion);
            var oRegexFilter = new RegexFilter();
            var shortCodeModel = oRegexFilter.GetShortCodeValues(oShortCode.Expression);
            var ostringBuilder = new StringBuilder();
            if (!string.IsNullOrEmpty(shortCodeModel.TableName))
            {
                ostringBuilder.AppendLine("SELECT ");
                ostringBuilder.AppendLine((shortCodeModel.KeyValue.Count > 0 ? string.Join(",", shortCodeModel.KeyValue.Select(x => x.Value)) : "*"));
                ostringBuilder.AppendLine(" FROM ");
                ostringBuilder.AppendLine(oShortCode.TableName);
                ostringBuilder.AppendLine(" WITH(NOLOCK) ");

                if (oShortCode.FilterCode.Count() > 0)
                {
                    ostringBuilder.AppendLine("WHERE ");
                    foreach (var filterCode in oShortCode.FilterCode)
                    {
                        ostringBuilder.AppendLine(filterCode.FilterColumnName);
                        ostringBuilder.AppendLine(filterCode.Operator);
                        ostringBuilder.AppendLine(filterCode.FilterColumnValue);
                    }
                }
            }
            var oDyanamicData = DBHelper.GetDataTable(ostringBuilder.ToString(), System.Data.CommandType.Text, new List<SqlParameter>());
            if (oDyanamicData != null)
            {
                if (oShortCode.IsHtmlRender)
                {
                    for (int i = 0; i < oDyanamicData.Rows.Count; i++)
                    {
                        for (int j = 0; j < oDyanamicData.Columns.Count; j++)
                        {
                            string key = Convert.ToString(oDyanamicData.Columns[j]);
                            string value = Convert.ToString(oDyanamicData.Rows[i].ItemArray[j]);
                            if (oShortCode.DisplayCode.Count > 0)
                            {
                                var displayCode = oShortCode.DisplayCode.FirstOrDefault(x => x.DisplayColumnName == key);
                                if (displayCode != null && !string.IsNullOrEmpty(displayCode?.ReplaceKey))
                                {
                                    oShortCode.DefinedHtml = oShortCode.DefinedHtml.Replace(displayCode.ReplaceKey, value);
                                }
                            }
                        }
                    }
                    return new MvcHtmlString(oShortCode.DefinedHtml);
                }
                else
                {
                    string key = string.Empty, value = string.Empty;
                    #region For Json
                    List<JObject> dataList = new List<JObject>();
                    for (int i = 0; i < oDyanamicData.Rows.Count; i++)
                    {
                        JObject eachRowObj = new JObject();
                        for (int j = 0; j < oDyanamicData.Columns.Count; j++)
                        {
                            key = Convert.ToString(oDyanamicData.Columns[j]);
                            value = Convert.ToString(oDyanamicData.Rows[i].ItemArray[j]);
                            eachRowObj.Add(key, value);
                        }
                        dataList.Add(eachRowObj);
                    }
                    return new MvcHtmlString(Newtonsoft.Json.JsonConvert.SerializeObject(dataList));
                    #endregion                    
                }
            }
            return oMvcHtmlString;
        }

Может кто-нибудь помочь мне решить выше на SQL сервере или prepared query на store procedure

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...