2

我的任务是为将检索数据库的表创建一个 .net 接口。

接口必须做的一件显而易见的事情是从表中检索数据。

所以....我可以编写一个简单地执行Select * from MyTable;然后返回结果的函数。但是,该表有十列,使用该界面的人可能希望按一列或多列过滤数据。我可能需要类似的东西Select * from MyTable where LastName like 'A%';。如何将我的界面设计为从表中下载数据的灵活单点入口?

有人告诉我,由于带宽问题,任何涉及从服务器拉下整个表然后在 .net 代码中过滤结果的解决方案都是不可接受的。

注意:我还想补充一点,从 SQL 表中检索数据的代码称为 WCF 服务;然而,数据被检索,它必须作为可序列化数据返回给调用者,而不是作为任何类型的引用。

澄清:我所说的“接口”只是指一个被调用以从 SQL 表中检索数据的函数。我意识到“接口”这个词有点令人困惑。我在做什么有一个词,但我不知道它是什么。

4

3 回答 3

3

我建议使用LINQ to Entities。它已经解决了所有带宽效率问题。

更新(针对 WCF):在这种情况下,我推荐WCF 数据服务(以前称为 ADO.NET 数据服务,以前称为 Astoria)。他们以一种有趣的方式使用称为 oData 的 REST 协议。本质上,您通过提供一个IQueryable<T>(例如,使用 LINQ to Entities)来实现该服务,然后您可以通过使用“LINQ to oData”来使用该服务(我只是编造了这个术语,但这就是想法)。

这样,您的客户可以执行以下操作:

var beverages = from product in myDataService.Products
                where product.CategoryName = "Beverages"
                select product;

(假设myDataService是一个DataServiceContract指向您的 WCF 数据服务)。该查询将转换为 oData 调用,例如http://myHost/myWCFService.svc/Products?$filter=CategoryName%20eq%20'Beverages'. oData 查询字符串由 WCF 数据服务解释,并传递给您的IQueryable<T>实现。如果这是 LINQ to Entities,则查询将传递到数据库,因此实际执行的 SQL 类似于SELECT * FROM [Products] WHERE [Products].[CategoryName] = 'Beverages'.

正如你所看到的,这是一个非常强大的概念,它允许非常有效的数据查询,而没有 SQL 注入的危险。有一个缺点:由于允许任何类型的查询,这种方法会使数据库优化更加困难。它还开辟了更容易的 DoS 攻击的可能性,尽管这些可能是有限的。因此,它使我们作为程序员的生活变得非常轻松,但一些 DBA 犹豫不决。

于 2010-07-06T20:12:08.037 回答
0

NHibernate、SubSonic、LINQ 2 SQL、实体框架、LLBLGen、Codus 等等。

我个人喜欢 NHibernate,它具有 Fluent 映射,但它可能被认为是矫枉过正并且有一点学习曲线。

Sh#rp Architecture、Spring.NET 和 Castle Active Record 等库将 NHibernate 的实现细节抽象出来,因此您可以专注于 Pocos 和业务,而无需担心维护 DAL。

于 2010-07-07T00:15:37.403 回答
-5

我会在一个表单上放置 10 个文本框,然后构建一个查询,例如:

string query = "select top 100 * from MyTable where 1=1 ";
if (!string.IsNullOrEmpty(txtLastName.Text))
    query += string.Format("and LastName like '%{0}%' ", txtLastName.Text);
if (!string.IsNullOrEmpty(txtFirstName.Text))
    query += string.Format("and FirstName like '%{0}%' ", txtFirstName.Text);

top子句确保这永远不会下载超过 100 行。

确保使用低权限用户执行生成的查询,或确保用户没有'在文本框中输入单引号 :)

于 2010-07-06T20:18:44.360 回答