C# 通过IQueryable执行存储过程或计算?

C# 通过IQueryable执行存储过程或计算?,c#,database,design-patterns,architecture,C#,Database,Design Patterns,Architecture,这是一个基于选择性能而不是设计实践的问题。如果我有一个每秒执行多次的方法 public static IQueryable<IPerson> InRadius(this IQueryable<IPerson> query, Coordinate center, double radius) { return (from u in query where CallHeavyMathFormula(u, center, radius)

这是一个基于选择性能而不是设计实践的问题。如果我有一个每秒执行多次的方法

public static IQueryable<IPerson> InRadius(this IQueryable<IPerson> query, Coordinate center, double radius)
{
    return (from u in query
            where CallHeavyMathFormula(u, center, radius)
            select u);
}
radius中的公共静态IQueryable(此IQueryable查询,坐标中心,双半径)
{
返回(来自查询中的u)
其中CallHeavyMath公式(u、中心、半径)
选择u);
}
IQueryable的这个扩展方法生成一个SQL,它执行一些繁重的数学计算(余弦、正弦等)。这意味着应用程序每次调用都会向服务器发送1-2KB的sql


我听说过在应用程序中放置所有应用程序逻辑。我还想在将来改用azure之类的数据库或可扩展数据库。我怎么处理这样的事情?我应该保持现在的状态还是编写存储过程?twitter或facebook等应用程序是如何做到这一点的?

存储过程语言往往将您与特定的供应商或产品紧密地联系在一起。如果你预期将来会迁移,就考虑改写的可能性。

话虽如此,我认为这样的决定取决于其他因素,比如是否需要将大量数据从数据库中移出并放入内存。有多少数据;多少记忆;在线路上来回传输多少字节?这些是你必须送的东西

每次数据库调用1-2KB对我来说并不是很多

我不会考虑计算正弦和余弦的重数学。动态FFT或线性代数解决方案将更具挑战性。任何我称之为重的东西都不会在一秒钟内执行好几次


在我看来,将此计算保留在应用程序端是安全的。

首先,根据使用的数据库,它可能会缓存存储过程和特殊查询的执行计划和结果。这应该是在代码与存储过程之间进行比较的主要原因。您还可以在sql中使用.net函数,将部分条件保留为.net代码(很难将条件编写为sql等) 然后,我将尝试缓存结果,而不是过于频繁地访问数据库

在应用程序中既有存储过程(主要用于复杂查询,SP将带来极大的改进)又有特殊代码(通过iqueriable),这并不是一种“罪恶”

使用sql分析器还可以帮助您决定最佳解决方案

并且,只要你在不久的将来计划中没有迁移到另一个DB,或者如果它只是一个“可能发生的”,现在就忽略它,稍后考虑把它作为必要的重构的一部分。