我正在创建一个连接到网站以执行查询的客户端应用程序。我没有让客户端直接连接到数据库,但他可以通过网站执行查询。
我通过网站执行查询的方式是通过linq。例如,我可以这样做:
MyEntities db = new MyEntities();
var customers = db.Customers.ToList();
由于客户端没有连接字符串,并且sql server在执行上述代码时不允许远程连接,因此显然不起作用。 我的问题是客户端如何将该查询发送到网络服务?
我之所以需要这个,是因为有很多不同类型的查询,每个不同的查询都要创建一个不同的页面。例如,我有GetInvoices.aspx,GetCustomers.aspx,我总是创建新的,因为我不希望客户端直接连接到数据库。如果我能序列化linq查询并将其发送到服务器,那将是很好的。然后,服务器应该验证我没有执行删除语句,如果是这样,那么执行查询。
这是我将仅针对select语句做的事情:
// Note connection string only have basics. It does not have password nor database.
public static string GenerateSelectQuery<T>(Func<Common.Data.TcEntities, IQueryable> method)
{
Common.Data.TcEntities db = new Common.Data.TcEntities(@"metadata=res://*/Data.Model1.csdl|res://*/Data.Model1.ssdl|res://*/Data.Model1.msl;provider=System.Data.SqlClient;provider connection string=""""");
var query = method(db);
return query.ToString();
}
然后如果我想创建自定义查询,我会这样做:
var query = GenerateSelectQuery<Customer>(db => db.Customers.Where(x=>x.FirstName.Contains("a")));
然后我会将该字符串发送到服务器并期望一组客户。在服务器端,我将确保字符串以select开头,并且不包含--
。
答案 0 :(得分:1)
实施WCF Data Services,http客户端可以使用OData protocol查询您的数据。
例如,使用http网址可以查询对您的客户集合应用select Name
:
http://youdomain/yourWCFDataServices.svc/Customers()?$select=Name