惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
Schneier on Security
Schneier on Security
B
Blog RSS Feed
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
A
About on SuperTechFans
Recorded Future
Recorded Future
Recent Announcements
Recent Announcements
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
Hugging Face - Blog
Hugging Face - Blog
The GitHub Blog
The GitHub Blog
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MyScale Blog
MyScale Blog
V2EX - 技术
V2EX - 技术
N
Netflix TechBlog - Medium
F
Fortinet All Blogs
V
Visual Studio Blog
Martin Fowler
Martin Fowler
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - Franky
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
The Exploit Database - CXSecurity.com
F
Full Disclosure
Scott Helme
Scott Helme
H
Heimdal Security Blog
博客园 - 叶小钗
Google DeepMind News
Google DeepMind News
Cyberwarzone
Cyberwarzone
Application and Cybersecurity Blog
Application and Cybersecurity Blog
V
Vulnerabilities – Threatpost
Blog — PlanetScale
Blog — PlanetScale
Security Latest
Security Latest
WordPress大学
WordPress大学
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Troy Hunt's Blog
S
SegmentFault 最新的问题
Forbes - Security
Forbes - Security
Jina AI
Jina AI
S
Securelist
小众软件
小众软件
Simon Willison's Weblog
Simon Willison's Weblog
J
Java Code Geeks
AWS News Blog
AWS News Blog
N
News and Events Feed by Topic
博客园 - 三生石上(FineUI控件)
量子位

博客园 - 面朝大海

MOSS微软教程 活动目录微软教程 Petshop教程、接口编程教程 asp.net 使用json 深入理解abstract class和interface 快速挤梦幻新区的技巧 - 面朝大海 - 博客园 解决blogspot.com博客不能访问的自动代理方法 全面剖析C#接口编程 CommunityServer 学习资源 Web 2.0 网站成功的关键 美化你的博客-推荐多个博客图标下载网站 动态创建DataGrid的模版列 强烈推荐:240多个jQuery插件 破解Office 2007激活? NUnit详细使用方法 MonoRail学习笔记系列文章 在非ASP.NET Web Project中创建和使用MonoRail Enterprise Library教程 asp.net 获得ip和mac地址
NBear查找指定的列
面朝大海 · 2007-12-06 · via 博客园 - 面朝大海

用NBear的时候,如果列表显示一组数据,此数据中只是返回少量字段信息,如:id,title等,点击详细后,再出现获取完整记录,如包括的content信息,往往content包含了比较大的数据量,如果返回整个实体,SQL的Reads自然会增加,服务器变做了许多无用的工作,性能自然也不好,我没有找到NBear中有解决相关问题的方法。所以我这里稍微改动了一下NBear,来实现列表数据的查询优化。步骤如下:

1、打开NBear的源代码,


我们将红线标示的两个文件。

1、修改FromClip.cs中的ToString()方法如下:

public override string ToString()
        
{
            StringBuilder sb 
= new StringBuilder();

            sb.Append(
'[');
            
string _tableOrViewName = tableOrViewName.TrimStart('[').TrimEnd(']');
            
if (_tableOrViewName.Substring(02== "__")
            
{
                _tableOrViewName 
= tableOrViewName.Substring(2, tableOrViewName.Length-2);
            }

            sb.Append(_tableOrViewName);
            sb.Append(
']');
            
if (aliasName != tableOrViewName)
            
{
                sb.Append(
' ');
                sb.Append(
'[');
                sb.Append(aliasName.TrimStart(
'[').TrimEnd(']'));
                sb.Append(
']');
            }


            
foreach (string joinAliasName in joins.Keys)
            
{
                
if (sb.ToString().Contains("INNER JOIN"))
                
{
                    sb 
= new StringBuilder('(' + sb.ToString() + ')');
                }


                KeyValuePair
<string, WhereClip> keyWhere = joins[joinAliasName];
                sb.Append(
" INNER JOIN ");
                sb.Append(
'[');
                sb.Append(keyWhere.Key.TrimStart(
'[').TrimEnd(']'));
                sb.Append(
']');
                
if (joinAliasName != keyWhere.Key)
                
{
                    sb.Append(
' ');
                    sb.Append(
'[');
                    sb.Append(joinAliasName.TrimStart(
'[').TrimEnd(']'));
                    sb.Append(
']');
                }

                sb.Append(
" ON ");
                sb.Append(keyWhere.Value.ToString());
            }


            
return sb.ToString();
        }

2、修改SqlQueryUtils.cs中AppendColumnName方法如下:

public static void AppendColumnName(StringBuilder sb, string columnName)
        
{
            Check.Require(sb 
!= null"sb could not be null!");
            Check.Require(columnName 
!= null"columnName could not be null!");

            
if (columnName.Contains("."))
            
{
                
string[] splittedColumnSections = columnName.Split('.');
                
for (int i = 0; i < splittedColumnSections.Length; ++i)
                
{
                    
if (splittedColumnSections[i] == "*" || splittedColumnSections[i].Contains("("|| splittedColumnSections[i].Contains("["))
                    
{
                        sb.Append(splittedColumnSections[i]);
                    }

                    
else
                    
{
                        sb.Append(
'[');
                        
string s = splittedColumnSections[i];
                        
if (0 == i)
                        
{
                            
if (s.Substring(02== "__")
                            
{
                                s 
= s.Substring(2, s.Length - 2);
                            }

                        }

                        sb.Append(s);
                        sb.Append(
']');
                    }


                    
if (i < splittedColumnSections.Length - 1)
                    
{
                        sb.Append(
'.');
                    }

                }

            }

            
else
            
{
                
if (columnName == "*" || columnName.Contains("("|| columnName.Contains("["))
                
{
                    sb.Append(columnName);
                }

                
else
                
{
                    sb.Append(
'[');
                    sb.Append(columnName);
                    sb.Append(
']');
                }

            }

        }


这里面做了简单的限定:如果实体类的开头以两条下划线"__"开头的话,那么就认为是承载未带下划线类的部分数据,承载字段根据承载类的属性确定

完成之后,编译项目。

2、项目中使用刚才我们编译出的NBear.Common.dll
如:EntityDesigns中

    public interface HtmlTable : Entity
    
{
        [PrimaryKey]
        
int id get; }
        [SqlType(
"varchar(255)")]
        
string title getset; }
        [SqlType(
"text")]
        
string context getset; }
    }


    
    
public interface __HtmlTable : Entity
    
{
        [PrimaryKey]
        
int id get; }
        [SqlType(
"varchar(255)")]
        
string title getset; }
    }

项目中

Entities.__HtmlTable[] tables = ServiceFactory.Create().GetService<ICommonService>().GetAllOfEntity<Entities.__HtmlTable>();
        
foreach (Entities.__HtmlTable table in tables)
        
{
            Response.Write( table.id 
+ ":" + table.title);
        }

查看数据检索的SQL语句如下:

为:SELECT [HtmlTable].[id],[HtmlTable].[title] From [HtmlTable]
而不是:SELECT [HtmlTable].[id],[HtmlTable].[title],[HtmlTable].[context] From [HtmlTable]

这样对性能应该会好些吧。