在C#/.NET3.5中构建动态SQL查询的最佳方式?我正在进行的一个项目涉及重构一个C#Com对象,该对象充当某些Sql2005数据库的数据库访问层。现有代码的作者使用字符串和许多if语句手动构建了所有sql查询,以构建相当复杂的sql语句(~10个连接、>10个子选择、~15-25个where条件和GroupBy)。基表始终相同,但连接、条件和分组的结构取决于传递给我的类/方法的一组参数。像这样构建SQL查询确实有效,但它显然不是一个非常优雅的解决方案(并且难以阅读/理解和维护)......我可以自己编写一个简单的“querybuilder”,但我很确定我不是第一个遇到这种问题的人,所以我的问题是:我正在使用C#和Linq做一些类似的事情来根据用户输入过滤日志条目(参见条件Linq查询):IQueryablematches=m_Locator.Logs;//用户过滤if(usersFilter)matches=matches.Where(l=>l.UserName==comboBoxUsers.Text);//严重性过滤器if(severityFilter)matches=matches.Where(l=>l.Severity==comboBoxSeverity.Text);Logs=(fromloginmatchesorderbylog.EventTimedescendingselectlog).ToList();编辑:直到最后一条语句中的.ToList()才执行查询。除非执行时间很关键,否则我会考虑重构(通常)倾向于找到通往数据层和数十亿存储过程的业务逻辑。在可维护性、可编辑性和可附加性方面,我总是尝试(作为C#程序员)将代码提升到业务层。试图找出别人的8000行SQL脚本不是我最喜欢的任务。?//wLINQ是必经之路。我是这样做的:publicIQueryableGetClients(Expression>criteria){return(frommodelinContext.Client.AsExpandable()wherecriteria.Invoke(model)selectnewIbfx.AppServer.Imsdb.Entities.Client.ClientEntity(){Id=model.Id,ClientNumber=model.ClientNumber,NameFirst=model.NameFirst,//更多属性在这里});您传入的Expression参数将是您将使用不同的WHERE子句、JOINS等构建的动态查询。这个表达式将在运行时被调用并给你你想要的。下面是如何调用它的示例:publicIQueryableGetClientsWithWebAccountId(intwebAccountId){varcriteria=PredicateBuilder.True();criteria=criteria.And(c=>c.ClientWebAccount.WebAccountId.Equals(webAccountId));返回GetClients(条件);如果您可以将条带化过程实现为参数化并在数据库中对其进行优化,而不是在运行时通过LINQ或ORM动态生成SQL,则值得考虑。通常这会表现得更好。我知道这有点过时,但有时它是最有效的方法。我了解Linq的潜力,但我还没有看到有人尝试使用Lin提出的相当复杂的sql语句进行Linq查询(~10个连接,>10个子选择,~15-25个条件和GroupBy)任何人都有大型Linq查询的示例,以及对它们的可管理性有何评论?LinqtoSQL将一些不错的可能性与System.Linq.Dynamic结合在一起。我在这里发布了几个示例代码片段:http://blog.huagati.com/res/index.php/2008/06/23/application-architecture-part-2-data-access-layer-dynamic-linq...在这里:http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/717004553931?r=777003863931#777003863931我来晚了,还没来得及投票,但我有一个我没有考虑过的不错的解决方案:过程/函数和linq-to-object的组合。或者我认为是to-xml或者to-datatable。在这种情况下,我一直都有,有一个巨大的动态构建的查询,这是一个令人印象深刻的壮举,但其复杂性导致维护噩梦。我有这么多绿色评论,帮助那些不得不过来看看的可怜的闷棍。我是经典的asp,所以我别无选择。我这样做的原因是函数/程序和linq的结合。通常总的复杂性比尝试在一个地方做要低。将您的一些标准传递给UDF,它将变得更易于管理。这为您提供了一个易于管理和理解的结果集。使用linq应用剩余的差异。您可以利用两者:如何确定在db中处理哪些条件以及在linq中处理哪些条件?运用你的判断力。如果你能有效地处理复杂的数据库查询,你就可以处理这个问题。部分艺术,部分科学。您可能需要考虑像这样的LINQ或O/R映射器:http://www.llblgen.com/如果您使用C#和.NET3.5,添加MSSQLServer,那么LINQtoSQL绝对是最佳选择。如果该组合不是您正在使用的组合,我建议使用ORM路线,例如nHibernate或Subsonic。在http://www.blackbeltcoder.com/Articles/strings/a-sql-querybuilder-class的QueryBuilder类中进行了实验性尝试。也许值得一瞧。查看http://sqlom.sourceforge.net。我认为它完全符合您的要求。以上是C#学习教程:BestwaytobuilddynamicSQLqueriesinC#/.NET3.5?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
