主頁 > .NET開發 > 基于SqlSugar的開發框架循序漸進介紹(31)-- 在查詢介面中實作多表聯合和單表物件的統一處理

基于SqlSugar的開發框架循序漸進介紹(31)-- 在查詢介面中實作多表聯合和單表物件的統一處理

2023-06-03 08:56:54 .NET開發

在一些復雜的業務表中間查詢資料,有時候操作會比較復雜一些,不過基于SqlSugar的相關操作,處理的代碼會比較簡單一些,以前我在隨筆《基于SqlSugar的開發框架循序漸進介紹(2)-- 基于中間表的查詢處理》介紹過基于主表和中間表的聯合查詢,而往往實際會比這個會復雜一些,本篇隨筆介紹聯合多個表進行查詢以及樹形串列的條件展示的處理實作,系統能夠給大家一些參考思路,

1、SqlSugar的開發框架的資料查詢處理

在隨筆《基于SqlSugar的開發框架循序漸進介紹(2)-- 基于中間表的查詢處理》中,介紹過兩個表的聯合查詢,如下所示代碼所示,

/// <summary>
/// 根據用戶ID獲取對應的角色串列
/// </summary>
/// <param name="userID">用戶ID</param>
/// <returns></returns>
private async Task<List<RoleInfo>> GetByUser(int userID)
{
    var query = this.Client.Queryable<RoleInfo, User_RoleInfo>(
    (t, m) => t.Id == m.Role_ID && m.User_ID == userID)
    .Select(t => t); //聯合條件獲取物件

    query = query.OrderBy(t => t.CreateTime);//排序
    var list = await query.ToListAsync();//獲取串列
    return list;
}

/// <summary>
/// 根據機構獲取對應的角色串列(判斷機構角色中間表)
/// </summary>
/// <param name="ouID">機構的ID</param>
/// <returns></returns>
public async Task<List<RoleInfo>> GetRolesByOu(int ouID)
{
    var query = this.Client.Queryable<RoleInfo, OU_RoleInfo>(
    (t, m) => t.Id == m.Role_ID && m.Ou_ID == ouID)
    .Select(t => t); //聯合條件獲取物件

    query = query.OrderBy(t => t.CreateTime);//排序
    var list = await query.ToListAsync();//獲取串列
    return list;
}

我們對于后端的資料查詢,一般都是傳入一個條件物件,通過條件類的屬性進行構建查詢資訊,如下簡單的處理操作,

/// <summary>
/// 應用層服務介面實作
/// </summary>
public class CustomerService : MyCrudService<CustomerInfo, string, CustomerPagedDto>, ICustomerService
{
    /// <summary>
    /// 自定義條件處理
    /// </summary>
    /// <param name="input">查詢條件Dto</param>
    /// <returns></returns>
    protected override ISugarQueryable<CustomerInfo> CreateFilteredQueryAsync(CustomerPagedDto input)
    {
        var query = base.CreateFilteredQueryAsync(input);

        query = query
            .WhereIF(!input.ExcludeId.IsNullOrWhiteSpace(), t => t.Id != input.ExcludeId) //不包含排除ID
            .WhereIF(!input.Name.IsNullOrWhiteSpace(), t => t.Name.Contains(input.Name)) //如需要精確匹配則用Equals
                                                                                         //年齡區間查詢
            .WhereIF(input.AgeStart.HasValue, s => s.Age >= input.AgeStart.Value)
            .WhereIF(input.AgeEnd.HasValue, s => s.Age <= input.AgeEnd.Value)

            //創建日期區間查詢
            .WhereIF(input.CreateTimeStart.HasValue, s => s.CreateTime >= input.CreateTimeStart.Value)
            .WhereIF(input.CreateTimeEnd.HasValue, s => s.CreateTime <= input.CreateTimeEnd.Value)
            ;

        return query;
    }

上面的 CreateFilteredQueryAsync 方法是一個基類函式,主要是構建該業務表的一些資料查詢的匹配處理,如對于復雜一些的查詢條件,這個內容會增加很多,不過都是可以通過代碼生成工具基于資料庫表欄位來進行一一對應的生成,從而避免人工繁瑣的敲擊代碼,

如下面是基類函式的常規條件查詢和計數的函式處理,

/// <summary>
/// 根據條件獲取串列
/// </summary>
/// <param name="input">分頁查詢條件</param>
/// <returns></returns>
public virtual async Task<PagedResultDto<TEntity>> GetListAsync(TGetListInput input)
{
    var query = CreateFilteredQueryAsync(input);
    var totalCount = await query.CountAsync();

    query = ApplySorting(query, input);
    query = ApplyPaging(query, input);

    var list = await query.ToListAsync();

    return new PagedResultDto<TEntity>(
       totalCount,
       list
   );
}

/// <summary>
/// 根據條件計算記錄數量
/// </summary>
/// <param name="input">查詢條件,忽略分頁資訊</param>
/// <returns></returns>
public virtual async Task<long> CountAsync(TGetListInput input)
{
    var query = CreateFilteredQueryAsync(input);

    var totalCount = await query.CountAsync();
    return totalCount; //回傳符合條件的所有數量
}

上面的 CreateFilteredQueryAsync 方法一般會在具體的業務類中進行重寫,從而實作具體條件的查詢過濾,

 

2、對于多表的聯合處理操作

而對于復雜的多表之間的聯合查詢處理,如果分開多個函式來實作,可能會比較麻煩,而且也不夠統一,因此我們可以統一整合在CreateFilteredQueryAsync 實作,

而一些特殊的條件,我們可以在原有生成的條件分頁類里面,增加更多的屬性,用來在聯合查詢中賦值、或者獲取值,如下圖是我們額外增加的幾個特殊的屬性,用來在其他業務表中進行關聯查詢的欄位,

由于客戶分組是在另外一張表里面記錄的,客戶和分組之間的關聯,是通過中間表的聯合查詢獲得的,

 客戶和供應商也有一個中間表的關聯關系,因此我們如何聯合查詢,根據條件,可以通過下面的代碼進行聯合查詢獲得,

            if (!input.GroupId.IsNullOrWhiteSpace())
            {
                // 聯合 CustomerGroup_CustomerInfo 表進行查詢
                query = this.Client.Queryable<CustomerInfo, CustomerGroup_CustomerInfo>(
                       (t, m) => t.Id == m.Customer_ID && m.CustomerGroup_ID == input.GroupId)
                       .Select(t => t).MergeTable(); //聯合條件獲取物件
            }       
            if(!input.SupplierId.IsNullOrEmpty())
            {
                query = this.Client.Queryable<CustomerInfo, Customer_SupplierInfo>(
                        (t, m) => t.Id == m.Customer_ID && m.Supplier_ID == input.SupplierId)
                        .Select(t => t).MergeTable(); //聯合條件獲取物件
            }

上面的代碼,需要注意的是,不同表之間聯合獲得的結果,如果需要整合到主表進行的查詢中,則需要使用 .MergeTable() 操作進行合并處理,

這種最終我們可以得到比較復雜一些的查詢處理了,

        /// <summary>
        /// 自定義條件處理
        /// </summary>
        /// <param name="input">查詢條件Dto</param>
        /// <returns></returns>
        protected override ISugarQueryable<CustomerInfo> CreateFilteredQueryAsync(CustomerPagedDto input)
        {
            var query = base.CreateFilteredQueryAsync(input);
            if (!input.GroupId.IsNullOrWhiteSpace())
            {
                // 聯合 CustomerGroup_CustomerInfo 表進行查詢
                query = this.Client.Queryable<CustomerInfo, CustomerGroup_CustomerInfo>(
                       (t, m) => t.Id == m.Customer_ID && m.CustomerGroup_ID == input.GroupId)
                       .Select(t => t).MergeTable(); //聯合條件獲取物件
            }       
            if(!input.SupplierId.IsNullOrEmpty())
            {
                query = this.Client.Queryable<CustomerInfo, Customer_SupplierInfo>(
                        (t, m) => t.Id == m.Customer_ID && m.Supplier_ID == input.SupplierId)
                        .Select(t => t).MergeTable(); //聯合條件獲取物件
            }

            //通過名稱或代碼查詢,任一符合即可
            query = query.WhereIF(!input.NameOrCode.IsNullOrWhiteSpace(), t => t.Name.Contains(input.NameOrCode) || t.SimpleName.Contains(input.NameOrCode) || t.HandNo.Contains(input.NameOrCode));

            query = query
               .WhereIF(!input.ExcludeId.IsNullOrWhiteSpace(), t => t.Id != input.ExcludeId) //不包含排除ID
               .WhereIF(!input.HandNo.IsNullOrWhiteSpace(), t => t.HandNo.Contains(input.HandNo)) //如需要精確匹配則用Equals
                .WhereIF(!input.Name.IsNullOrWhiteSpace(), t => t.Name.Contains(input.Name)) //如需要精確匹配則用Equals
                .WhereIF(!input.SimpleName.IsNullOrWhiteSpace(), t => t.SimpleName.Contains(input.SimpleName)) //如需要精確匹配則用Equals
                .WhereIF(!input.Province.IsNullOrWhiteSpace(), t => t.Province.Contains(input.Province)) //如需要精確匹配則用Equals
                .WhereIF(!input.City.IsNullOrWhiteSpace(), t => t.City.Contains(input.City)) //如需要精確匹配則用Equals
                .WhereIF(!input.District.IsNullOrWhiteSpace(), t => t.District.Contains(input.District)) //如需要精確匹配則用Equals
                .WhereIF(!input.Area.IsNullOrWhiteSpace(), t => t.Area.Contains(input.Area)) //如需要精確匹配則用Equals
                .WhereIF(!input.Address.IsNullOrWhiteSpace(), t => t.Address.Contains(input.Address)) //如需要精確匹配則用Equals
                .WhereIF(!input.ZipCode.IsNullOrWhiteSpace(), t => t.ZipCode.Contains(input.ZipCode)) //如需要精確匹配則用Equals
                .WhereIF(!input.Telephone.IsNullOrWhiteSpace(), t => t.Telephone.Contains(input.Telephone)) //如需要精確匹配則用Equals
                .WhereIF(!input.Fax.IsNullOrWhiteSpace(), t => t.Fax.Contains(input.Fax)) //如需要精確匹配則用Equals
                .WhereIF(!input.Contact.IsNullOrWhiteSpace(), t => t.Contact.Contains(input.Contact)) //如需要精確匹配則用Equals
                .WhereIF(!input.ContactPhone.IsNullOrWhiteSpace(), t => t.ContactPhone.Contains(input.ContactPhone)) //如需要精確匹配則用Equals
                .WhereIF(!input.ContactMobile.IsNullOrWhiteSpace(), t => t.ContactMobile.Contains(input.ContactMobile)) //如需要精確匹配則用Equals
                .WhereIF(!input.Email.IsNullOrWhiteSpace(), t => t.Email.Contains(input.Email)) //如需要精確匹配則用Equals
                .WhereIF(!input.QQ.IsNullOrWhiteSpace(), t => t.QQ.Contains(input.QQ)) //如需要精確匹配則用Equals
                .WhereIF(!input.Industry.IsNullOrWhiteSpace(), t => t.Industry.Contains(input.Industry)) //如需要精確匹配則用Equals
                .WhereIF(!input.BusinessScope.IsNullOrWhiteSpace(), t => t.BusinessScope.Contains(input.BusinessScope)) //如需要精確匹配則用Equals
                .WhereIF(!input.Brand.IsNullOrWhiteSpace(), t => t.Brand.Contains(input.Brand)) //如需要精確匹配則用Equals
                .WhereIF(!input.PrimaryClient.IsNullOrWhiteSpace(), t => t.PrimaryClient.Contains(input.PrimaryClient)) //如需要精確匹配則用Equals
                .WhereIF(!input.PrimaryBusiness.IsNullOrWhiteSpace(), t => t.PrimaryBusiness.Contains(input.PrimaryBusiness)) //如需要精確匹配則用Equals
                                                                                                                              //注冊資金區間查詢
               .WhereIF(input.RegisterCapitalStart.HasValue, s => s.RegisterCapital >= input.RegisterCapitalStart.Value)
               .WhereIF(input.RegisterCapitalEnd.HasValue, s => s.RegisterCapital <= input.RegisterCapitalEnd.Value)
               //營業額區間查詢
               .WhereIF(input.TurnOverStart.HasValue, s => s.TurnOver >= input.TurnOverStart.Value)
               .WhereIF(input.TurnOverEnd.HasValue, s => s.TurnOver <= input.TurnOverEnd.Value)
                .WhereIF(!input.LicenseNo.IsNullOrWhiteSpace(), t => t.LicenseNo.Contains(input.LicenseNo)) //如需要精確匹配則用Equals
                .WhereIF(!input.Bank.IsNullOrWhiteSpace(), t => t.Bank.Contains(input.Bank)) //如需要精確匹配則用Equals
                .WhereIF(!input.BankAccount.IsNullOrWhiteSpace(), t => t.BankAccount.Contains(input.BankAccount)) //如需要精確匹配則用Equals
                .WhereIF(!input.LocalTaxNo.IsNullOrWhiteSpace(), t => t.LocalTaxNo.Contains(input.LocalTaxNo)) //如需要精確匹配則用Equals
                .WhereIF(!input.NationalTaxNo.IsNullOrWhiteSpace(), t => t.NationalTaxNo.Contains(input.NationalTaxNo)) //如需要精確匹配則用Equals
                .WhereIF(!input.LegalMan.IsNullOrWhiteSpace(), t => t.LegalMan.Contains(input.LegalMan)) //如需要精確匹配則用Equals
                .WhereIF(!input.LegalTelephone.IsNullOrWhiteSpace(), t => t.LegalTelephone.Contains(input.LegalTelephone)) //如需要精確匹配則用Equals
                .WhereIF(!input.LegalMobile.IsNullOrWhiteSpace(), t => t.LegalMobile.Contains(input.LegalMobile)) //如需要精確匹配則用Equals
                .WhereIF(!input.Source.IsNullOrWhiteSpace(), t => t.Source.Contains(input.Source)) //如需要精確匹配則用Equals
                .WhereIF(!input.WebSite.IsNullOrWhiteSpace(), t => t.WebSite.Contains(input.WebSite)) //如需要精確匹配則用Equals
                .WhereIF(!input.CompanyPictureGUID.IsNullOrWhiteSpace(), t => t.CompanyPictureGUID.Contains(input.CompanyPictureGUID)) //如需要精確匹配則用Equals
                .WhereIF(!input.CustomerType.IsNullOrWhiteSpace(), t => t.CustomerType.Contains(input.CustomerType)) //如需要精確匹配則用Equals
                .WhereIF(!input.Grade.IsNullOrWhiteSpace(), t => t.Grade.Contains(input.Grade)) //如需要精確匹配則用Equals
                .WhereIF(!input.CreditStatus.IsNullOrWhiteSpace(), t => t.CreditStatus.Contains(input.CreditStatus)) //如需要精確匹配則用Equals
                .WhereIF(!input.Importance.IsNullOrWhiteSpace(), t => t.Importance.Contains(input.Importance)) //如需要精確匹配則用Equals
                .WhereIF(input.IsPublic.HasValue, t => t.IsPublic == input.IsPublic) //如需要精確匹配則用Equals
                .WhereIF(input.Satisfaction.HasValue, t => t.Satisfaction == input.Satisfaction) //如需要精確匹配則用Equals
                .WhereIF(!input.Note.IsNullOrWhiteSpace(), t => t.Note.Contains(input.Note)) //如需要精確匹配則用Equals
                .WhereIF(input.TransactionCount.HasValue, t => t.TransactionCount == input.TransactionCount) //如需要精確匹配則用Equals
              
                //交易金額區間查詢
               .WhereIF(input.TransactionTotalStart.HasValue, s => s.TransactionTotal >= input.TransactionTotalStart.Value)
               .WhereIF(input.TransactionTotalEnd.HasValue, s => s.TransactionTotal <= input.TransactionTotalEnd.Value)
               //首次交易時間區間查詢
               .WhereIF(input.TransactionFirstDayStart.HasValue, s => s.TransactionFirstDay >= input.TransactionFirstDayStart.Value)
               .WhereIF(input.TransactionFirstDayEnd.HasValue, s => s.TransactionFirstDay <= input.TransactionFirstDayEnd.Value)
               //最近交易時間區間查詢
               .WhereIF(input.TransactionLastDayStart.HasValue, s => s.TransactionLastDay >= input.TransactionLastDayStart.Value)
               .WhereIF(input.TransactionLastDayEnd.HasValue, s => s.TransactionLastDay <= input.TransactionLastDayEnd.Value)
               //最近聯系日期區間查詢
               .WhereIF(input.LastContactDateStart.HasValue, s => s.LastContactDate >= input.LastContactDateStart.Value)
               .WhereIF(input.LastContactDateEnd.HasValue, s => s.LastContactDate <= input.LastContactDateEnd.Value)
                                                                                                      
               //創建時間區間查詢
               .WhereIF(input.CreateTimeStart.HasValue, s => s.CreateTime >= input.CreateTimeStart.Value)
               .WhereIF(input.CreateTimeEnd.HasValue, s => s.CreateTime <= input.CreateTimeEnd.Value)   
               //編輯時間區間查詢
               .WhereIF(input.EditTimeStart.HasValue, s => s.EditTime >= input.EditTimeStart.Value)
               .WhereIF(input.EditTimeEnd.HasValue, s => s.EditTime <= input.EditTimeEnd.Value)

               .WhereIF(!input.Stage.IsNullOrWhiteSpace(), t => t.Stage.Contains(input.Stage)) //如需要精確匹配則用Equals
               .WhereIF(!input.Status.IsNullOrWhiteSpace(), s => s.Status == input.Status)
               .WhereIF(!input.Creator.IsNullOrWhiteSpace(), t => t.Creator.Contains(input.Creator)) //如需要精確匹配則用Equals
               .WhereIF(!input.Editor.IsNullOrWhiteSpace(), t => t.Editor.Contains(input.Editor)) //如需要精確匹配則用Equals
               .WhereIF(input.Deleted.HasValue, s => s.Deleted == input.Deleted)
               .WhereIF(!input.Dept_ID.IsNullOrWhiteSpace(), t => t.Dept_ID.Contains(input.Dept_ID)) //如需要精確匹配則用Equals
               .WhereIF(!input.Company_ID.IsNullOrWhiteSpace(), t => t.Company_ID.Contains(input.Company_ID)) //如需要精確匹配則用Equals
               .WhereIF(!input.MarkColor.IsNullOrWhiteSpace(), t => t.MarkColor.Contains(input.MarkColor)) //如需要精確匹配則用Equals
               .WhereIF(!input.ShareUsers.IsNullOrWhiteSpace(), t => t.ShareUsers.Contains(input.ShareUsers)) //如需要精確匹配則用Equals
               ;

            return query;
        }

有了這個豐富條件的處理,我們就可以在前端進行屬性賦值就可以了,簡單的呼叫后端通用的介面查詢即可,

//構建分頁的條件和查詢條件
pagerDto = new CustomerPagedDto(this.winGridViewPager1.PagerInfo)
{
    //添加所需條件
    NameOrCode = this.txtCustomerNo.Text.Trim(),
    Deleted = 0
};

查詢獲得介面資料處理如下代碼所示,

var result = await BLLFactory<ICustomerService>.Instance.GetListAsync(pagerDto);
return result;

在分頁串列中展示獲得的記錄詳細資訊如下代碼所示,

/// <summary>
/// 系結串列資料
/// </summary>
private async void BindData()
{
    //entity
    this.winGridViewPager1.DisplayColumns = displayColumns;
    this.winGridViewPager1.ColumnNameAlias = await BLLFactory<ICustomerService>.Instance.GetColumnNameAlias();//欄位列顯示名稱轉義

    //獲取分頁資料串列
    var result = await GetData();

    //設定所有記錄數和串列資料源
    this.winGridViewPager1.PagerInfo.RecordCount = result.TotalCount; //需先于DataSource的賦值,更新分頁資訊
    this.winGridViewPager1.DataSource = result.Items;
    this.winGridViewPager1.PrintTitle = "客戶資訊串列";
}

 

3、對于多種屬性、狀態條件的統一處理

我在之前介紹過的CRM系統主界面中,關于客戶關系資訊的展示的時候,是通過一個復雜的樹形串列來承載不同屬性來進行快速的查詢,如下界面所示,

這些樹形串列的屬性資訊,在SqlSugar開發框架中,我們統一進行生成,首先定義一個通用的承載物件,如下類所示,

/// <summary>
/// 對CRM的業務資料進行統計的一個公共類
/// </summary>
public class CrmStaticsDto
{
    /// <summary>
    /// 節點顯示名稱
    /// </summary>
    public string Label { get; set; }

    /// <summary>
    /// 屬性名稱
    /// </summary>
    public string TypeName { get; set; }

    /// <summary>
    /// 數量
    /// </summary>
    public long Count { get; set; }

    /// <summary>
    /// 業務分類
    /// </summary>
    public string Category { get; set; }

    /// <summary>
    /// 記錄的日期開始
    /// </summary>
    public DateTime? DateStart { get; set; }
    /// <summary>
    /// 記錄的日期結束
    /// </summary>
    public DateTime? DateEnd { get; set; }

    /// <summary>
    /// 創建人資訊
    /// </summary>
    public CListItem Creator { get; set; }

    /// <summary>
    /// 子節點集合
    /// </summary>
    public List<CrmStaticsDto> children { get; set; } = new List<CrmStaticsDto>();
}

這個類似一個嵌套的集合,通過children進行添加更多的子集記錄,

后端提供一個獲取統計資訊的樹形串列的方法,如下定義所示,

        /// <summary>
        /// 獲取串列統計資訊
        /// </summary>
        /// <returns></returns>
        public async Task<List<CrmStaticsDto>> GetStatics(string compnayId)
{
................
}

但我們為它添加各種屬性的時候,設定相關的節點文本、類別資訊即可,

    //所有記錄
    var allNode = new CrmStaticsDto()
    {
        Label = "所有記錄"
    };
    list.Add(allNode);

    var propertyNode = new CrmStaticsDto()
    {
        Label = "客戶屬性分類"
    };
    list.Add(propertyNode);


    var typeName = "客戶狀態";
    var count = await baseQuery.Clone().CountAsync();//Clone()避免進行多次查詢時,可能會出現結果不正確的問題
    var statusNode = new CrmStaticsDto()
    {
        Label = $"{typeName}({count})",
        Count = count,
        TypeName = typeName
    };
    var dict = await dictDataService.FindByDictType(typeName);
    foreach (var info in dict)
    {
        var value =https://www.cnblogs.com/wuhuacong/p/ info.Value;
        var subCount = baseQuery.Clone().Where(s => s.Status == value).Count();
        statusNode.children.Add(new CrmStaticsDto()
        {
            Label = $"{info.Name}({subCount})",
            Count = subCount,
            Category = info.Value,
            TypeName = typeName
        });
    }
    propertyNode.children.Add(statusNode);

這樣我們在前端的WInform界面中展示樹形串列的時候,就會變得非常簡單,通過一個遞回的函式就可以添加相關的節點資訊了,如下代碼所示,

private async void InitTree()
{
    this.treeView1.BeginUpdate();
    this.treeView1.Nodes.Clear();

    //獲取所有的統計串列
    var staticsList = await BLLFactory<ICustomerService>.Instance.GetStatics(this.SelectedCompanyID);
    await AddTreeData(staticsList, null);

    //this.treeView1.ExpandAll();
    this.treeView1.EndUpdate();
}

private async Task AddTreeData(List<CrmStaticsDto> staticsList, TreeNode parentNode = null)
{
    var i = 0;
    if (staticsList != null)
    {
        foreach (var info in staticsList)
        {
            var node = new TreeNode(info.Label, i, i);
            node.Tag = info;
            node.Text = info.Label;

            await AddTreeData(info.children, node);

            if (parentNode == null)
            {
                this.treeView1.Nodes.Add(node); //如果是頂級處理,則treeView1節點加入
            }
            else
            {
                parentNode.Nodes.Add(node); //如果是遞回的,則加到父節點上
            }
        }
    }
}

以上就是對聯合多個表進行查詢以及樹形串列的條件展示的處理思路,系統能夠給大家一些參考思路,

專注于代碼生成工具、.Net/.NetCore 框架架構及軟體開發,以及各種Vue.js的前端技術應用,著有Winform開發框架/混合式開發框架、微信開發框架、Bootstrap開發框架、ABP開發框架、SqlSugar開發框架等框架產品,
轉載請注明出處:撰寫人:伍華聰 http://www.iqidi.com

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/554213.html

標籤:WinForm

上一篇:基于SqlSugar的開發框架循序漸進介紹(31)-- 在查詢介面中實作多表聯合和單表物件的統一處理

下一篇:返回列表

標籤雲
其他(160275) Python(38199) JavaScript(25474) Java(18184) C(15236) 區塊鏈(8269) C#(7972) AI(7469) 爪哇(7425) MySQL(7226) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5346) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4582) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1981) 功能(1967) HtmlCss(1952) Web開發(1951) C++(1928) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1879) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • 基于SqlSugar的開發框架循序漸進介紹(31)-- 在查詢介面中實作多表

    在一些復雜的業務表中間查詢資料,有時候操作會比較復雜一些,不過基于SqlSugar的相關操作,處理的代碼會比較簡單一些,以前我在隨筆《基于SqlSugar的開發框架循序漸進介紹(2)-- 基于中間表的查詢處理》介紹過基于主表和中間表的聯合查詢,而往往實際會比這個會復雜一些。本篇隨筆介紹聯合多個表進行... ......

    uj5u.com 2023-06-03 08:56:54 more
  • 基于SqlSugar的開發框架循序漸進介紹(31)-- 在查詢介面中實作多表

    <a href="https://www.cnblogs.com/wuhuacong/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u8867.png" alt="" /></a>...

    uj5u.com 2023-06-03 08:50:57 more
  • 介紹.NET幾種人臉識別組件

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-06-02 09:27:30 more
  • 介紹.NET幾種人臉識別組件

    人臉識別技術在現代社會中扮演著越來越重要的角色,比如人臉識別門禁、人臉識別支付、甚至人臉識別網站登錄等。 最近有群友問.NET有沒有人臉識別的組件,小編查閱相關資料介紹下面幾種.NET人臉識別組件供大家參考。 **1、Microsoft Azure Face API** 簡介:Microsoft A ......

    uj5u.com 2023-06-02 09:26:55 more
  • 由C# yield return引發的思考

    <a href="https://www.cnblogs.com/wucy/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2042116/20211209170256.png" alt="" /></a...

    uj5u.com 2023-05-31 09:56:16 more
  • Spectre.Console-實作自己的CLI

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-05-31 09:56:09 more
  • Spectre.Console-實作自己的CLI

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-05-31 09:55:47 more
  • 由C# yield return引發的思考

    ### 前言 當我們撰寫 C# 代碼時,經常需要處理大量的資料集合。在傳統的方式中,我們往往需要先將整個資料集合加載到記憶體中,然后再進行操作。但是如果資料集合非常大,這種方式就會導致記憶體占用過高,甚至可能導致程式崩潰。 C# 中的`yield return`機制可以幫助我們解決這個問題。通過使用`y ......

    uj5u.com 2023-05-31 09:55:31 more
  • 第二單元 常用快捷鍵,注釋,變數

    1. 注釋 不寫注釋的程式員都是耍流氓!!名字瞎起是更是土匪!!! 1. 單行文本注釋 static void Main(string[] args) { // 這是單行文本注釋,向控制臺輸出一段字串 Console.WriteLine("Hello World!"); Console.ReadL ......

    uj5u.com 2023-05-30 06:39:57 more
  • 每個.NET開發都應該知道的10個.NET庫

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-05-26 15:08:19 more