序列化linq查询,以便可以在其他地方执行

时间:2014-02-20 20:02:59

标签: c# linq serialization expression-trees

我正在创建一个连接到网站以执行查询的客户端应用程序。我没有让客户端直接连接到数据库,但他可以通过网站执行查询。

我通过网站执行查询的方式是通过linq。例如,我可以这样做:

MyEntities db = new MyEntities();
var customers = db.Customers.ToList();

由于客户端没有连接字符串,并且sql server在执行上述代码时不允许远程连接,因此显然不起作用。 我的问题是客户端如何将该查询发送到网络服务?

我之所以需要这个,是因为有很多不同类型的查询,每个不同的查询都要创建一个不同的页面。例如,我有GetInvoices.aspx,GetCustomers.aspx,我总是创建新的,因为我不希望客户端直接连接到数据库。如果我能序列化linq查询并将其发送到服务器,那将是很好的。然后,服务器应该验证我没有执行删除语句,如果是这样,那么执行查询。


Eidt

这是我将仅针对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开头,并且不包含--

1 个答案:

答案 0 :(得分:1)

实施WCF Data Services,http客户端可以使用OData protocol查询您的数据。

例如,使用http网址可以查询对您的客户集合应用select Name

http://youdomain/yourWCFDataServices.svc/Customers()?$select=Name