使用Linq到Sql没有连接

时间:2014-02-22 00:27:47

标签: c# linq linq-to-sql

我正在阅读linq是懒惰的,并且在它需要之前它没有执行查询。

如果是这种情况,为什么这段代码会失败:

var db = new Data.DataClasses1DataContext(@"Data Source=.\sqlexpress;Initial Catalog=MyDb;Integrated Security=True");

var companies = db.Customers.Where(x => x.Company=="Foo");

var query = companies.ToString();

如果我在没有安装sql server的计算机上运行该代码,它将无法运行原因?我没有做任何需要数据的陈述。如果我打电话给companies.ToList()那么可以让代码失败。有没有办法可以在不使用连接的情况下使用Linq to SQL Classes。我知道当我做ToList()或尝试枚举结果时我会得到一个错误。 我只想使用Linq to Sql Classes来生成SQL语句并将它们视为字符串。

我有一个客户端和一个服务器。服务器是WCF服务,客户端是控制台应用程序。我将为用户未输入的情况发送加密查询。我想使用Linq to Sql classes生成我的查询它不会使我必须在客户端上安装sql server以便我可以生成查询。


我的临时解决方案是在同一台服务器上创建第二个数据库。该数据库将被允许接受远程连接,并且它的整个目的是使该行

var db = new Data.DataClasses1DataContext(@“some remote connection string”);

的工作原理。一旦我初始化该行,我将永远不再需要连接。这没有道理。

2 个答案:

答案 0 :(得分:1)

问题在于创建db上下文对象而不是在linq语句中。具体来说,为了创建db上下文对象,您需要一个实际的连接字符串。如果你没有提供一个,那么你试图创建的db上下文,我想它会为null或者你会得到一个例外。然后使用此null对象定义linq查询将引发异常,即使您的查询不使用ToList(),它将定义强制执行您的linq查询。

再次阅读你的帖子我相信你应该在连接字符串中定义服务器中安装的sql express服务器,它将托管WCF服务。然后具有此连接字符串的客户端将能够调用您的服务器数据库。

答案 1 :(得分:1)

不要在客户端上生成查询,然后将SQL传递给服务。相反,在客户端上生成lambda表达式,将表达式发送到服务。

请参阅“How can I pass a lambda expression to a WCF service?”。

这将解决的一个问题是数据库和模式版本控制。按照您的方式执行此操作将要求客户端了解数据库架构甚至数据库版本,并且它与服务使用的相同(或兼容)。否则,您将无法在客户端上生成SQL Server的一个版本的SQL,然后发送到该服务上的其他SQL Server版本(或等效地,不同的数据库架构)。