2014-02-22 33 views
1

我在读那个linq是懒惰的,它没有执行查询,直到它需要。无连接使用Linq到Sql

如果这就是为什么这段代码失败的情况下:

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服务器上安装它不会运行,为什么?我没有做任何需要数据的陈述。如果我打电话给companies.ToList(),那么它的代码就会失败。有没有一种方法可以在不使用连接的情况下使用Linq to SQL Classes。我知道我做ToList()的那一刻,或者尝试枚举结果,我会得到一个错误。 我只是想使用Linq to Sql Classes来生成SQL语句并将它们看作字符串。

我有一个客户端和服务器。服务器是WCF服务,客户端是控制台应用程序。如果用户没有输入,我将发送加密查询。我希望使用Linq to Sql classes来生成我的查询,但它并没有让我必须在客户端上安装sql server,以便我可以生成查询。


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

变种分贝=新Data.DataClasses1DataContext(@“一些远程连接字符串”);

工程。一旦我初始化该行,我将永远不需要再次连接。这个不成立。

+2

我不相信company.ToString()会返回SQL查询。它应该返回查询的结果,在这种情况下它是IEnumerable 。ToString() – evanb

+0

如果您不知道如何编写SQL语句,但您确实知道如何编写Linq2Sql Lambda表达式,那么使用[LINQPad](https://www.linqpad.net)这样的产品会非常容易。 /)编写代码,然后查看SQL语句的外观。 –

+0

'companies.ToString()'将生成sql语句。此外,我可以使用'DataContext.GetCommand'提取要在db上执行的sqlCommands。加上它的速度更快,更安全,我认为用Linq构建查询而不是将它们放入字符串中 –

回答

1

不生成查询在客户端上,然后通过SQL的服务。相反,在客户端生成lambda表达式,然后将表达式发送到该服务。

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

的一个问题,这将解决的是,数据库和架构版本的。按照你的方式做,需要客户端理解数据库模式,甚至是数据库版本,并且它与服务使用的相同(或兼容)。否则,你会被卡在客户端上生成一个版本的SQL Server的SQL,然后发送到该服务上的另一个SQL Server版本(或等价地,不同的数据库模式)。

1

的问题是在创建数据库上下文对象的,而不是在LINQ声明。具体来说,为了创建数据库上下文对象,你需要一个实际的连接字符串。如果你不提供一个,那么你尝试创建的数据库上下文,我想它会是空的,否则你会得到一个异常。然后使用这个空对象定义你的linq查询将会抛出一个异常,即使你的查询没有使用ToList(),它将定义强制执行你的linq查询。

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

+0

如何伪造db上下文的创建?我永远不会使用它 –

+0

这个[XY问题]的气味(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你想通过伪造你不会用到的东西来解决什么问题?如果你不打算使用它们,创建SQL语句的目的是什么? –

+0

我不知道如何生成SQL语句,因此我想使用linq。我想使用linq to sql类来生成sql语句。然后我会把这些交给wcf服务。我永远不会执行客户端中的这些状态 –