Entity framework “拇指书写规则”;“查询”;使用ADO.NET实体框架
我目前正在开发一个中型web应用程序的原型,我认为也可以尝试使用实体框架。问题是,应用程序的主要部分不是数据层和逻辑,因此我没有太多时间使用实体框架。另一方面,数据库模式非常简单 我面临的一个问题是,我无法找到一种“编写查询”的一致方法。据我所知,这项工作有四个“接口”:Entity framework “拇指书写规则”;“查询”;使用ADO.NET实体框架,entity-framework,ado.net,Entity Framework,Ado.net,我目前正在开发一个中型web应用程序的原型,我认为也可以尝试使用实体框架。问题是,应用程序的主要部分不是数据层和逻辑,因此我没有太多时间使用实体框架。另一方面,数据库模式非常简单 我面临的一个问题是,我无法找到一种“编写查询”的一致方法。据我所知,这项工作有四个“接口”: LINQ到实体 使用LINQ扩展方法将LINQ转换为实体 实体SQL 查询生成器 好的,前两个基本上是相同的,但最好只使用一个来维护和保持一致性 我最困惑的是,它们似乎没有一个是完整的和最普遍的。我经常发现自己被逼得走投无
- LINQ到实体
- 使用LINQ扩展方法将LINQ转换为实体
- 实体SQL
- 查询生成器
- 我还经常使用ObjectQuery.Include()方法,但它同样需要一个字符串。这是唯一的办法吗
- 何时使用ObjectQuery.Execute()(vs.ToList())?它是否实际执行查询
- 应该尽快执行查询(例如,使用ToList()),还是我不介意让执行留给第一个遇到阻碍的枚举
- ObjectQuery.Skip()和ObjectQuery.Take()是否仅作为扩展方法可用?有没有更好的方法进行分页?现在是2009年,几乎每个web应用程序都处理分页李>
你的拇指规则是什么?我尽可能多地使用LINQ来创建实体。我还尝试将lambda形式正式化,而不是扩展的SQL样式语法。我不得不承认,为了加快应用程序的编码,我在执行关系和降低效率方面遇到了问题(例如,主->子表可能需要手动加载),但总而言之,EF是一个好产品 我确实使用EF的.Include()方法进行延迟加载,正如您所说,它确实需要字符串输入。我发现这没有问题,除了识别要使用的字符串相对简单之外。我想,如果您热衷于这种关系的编译时检查,那么类似于:Parent.GetChildren()的模型可能更合适 不过,我的应用程序确实需要执行一些“动态”查询。我有两种方法来解决这个问题: a) 我创建了一个mediator对象,例如ClientSearchMediator,它“知道”如何按名称搜索客户机等。然后我可以通过SearchHandler.search(ISearchMediator[]mediators)调用(例如)来实现这一点。这可用于针对特定的数据结构,并使用LINQ to实体对结果进行相应排序
b) 对于更宽松的体验,可能是用户设计自己的查询(使用我们的应用程序提供的高级工具)的结果,eSQL是实现这一目的的理想选择。它可以保证注射安全。我没有足够的知识来解决所有这些问题,但我至少要尝试一下 我不知道你为什么认为ADO.NET比实体框架更一致。使用ADO.NET有许多不同的方法,我肯定在单个代码库中看到了不一致性 Entity Framework目前是1.0版本,它存在许多1.0类型的问题(API不完整、不一致、缺少功能等) 关于包含,我想您指的是急切加载。很多人(微软以外的人)已经开发出了获取“类型安全”包含的解决方案(试着在谷歌上搜索:Entity Framework ObjectQueryExtension包含)。也就是说,Include更像是一个暗示。您不能强制立即加载,而且必须始终记住调用IsLoaded()方法以查看您的请求是否得到满足。据我所知,“包含”的工作方式在Entity Framework的下一个版本(4.0-与VS2010一起发布)中根本没有改变 至于在构建Linq查询时执行Linq查询,而不是在最后一个可能的时刻执行Linq查询,这个决定是根据情况而定的。就我个人而言,除非有令人信服的理由不这样做,否则我可能会在大部分情况下一建成就执行它,但我可以看到其他人朝着相反的方向走
市场上有更成熟的ORM,实体框架不一定是您的最佳选择。在大多数情况下,您可以根据自己的意愿调整实体框架,但最终可能会推出自己的功能实现,这些功能是其他ORM现成的。“使用LINQ扩展方法的LINQ到实体”:您是指LINQ到对象吗?因为LINQtoEntities也使用扩展方法……有趣的问题——我自己也遇到过类似的困惑,但这触及了问题的核心:应该如何使用LINQtoEntities?一致性很重要。@Yannick:我想这是因为有很多不同的方法来做同一件事。当然,
BLA.Select(x=>…myProjection…
与BLA-Select…myProjection…中x的相同,但在代码中不一致地使用这两个选项会降低可读性