所以我有这个查询
var pac = from p in context.pacientebi where p.personalid == piradinomeri select p;
它会生成这个sql
SELECT
[Extent1].[id] AS [id],
[Extent1].[name] AS [name],
[Extent1].[surname] AS [surname],
[Extent1].[dateofbirth] AS [dateofbirth],
[Extent1].[personalid] AS [personalid],
[Extent1].[phonenumber] AS [phonenumber],
[Extent1].[sqesi] AS [sqesi],
[Extent1].[address] AS [address],
[Extent1].[shemosvlisdro] AS [shemosvlisdro],
[Extent1].[email] AS [email]
FROM [dbo].[pacientis] AS [Extent1]
WHERE ([Extent1].[personalid] = @p__linq__0) OR (([Extent1].[personalid] IS NULL) AND (@p__linq__0 IS NULL))
如果我更改表名以包含数据库名称,则并且不返回任何值 像这样
FROM [dbo].[pacientis]
到这个
[CachedeskBase].[dbo].[pacientis]
一切都很好。
那么为什么linq to slq会产生不完整的查询呢?
答案 0 :(得分:2)
我知道可能导致问题的原因;
您应检查当前的连接字符串是否包含默认目录参数,并可能确保已设置应用程序的数据库用户默认数据库。
在连接字符串中设置初始目录/数据库变量:
您可能错过了输入或忘记在连接字符串中包含default catalogue/database。
在连接字符串中包含default catalogue
会告诉数据库服务器您的请求使用哪个数据库。 (在这种情况下,您的LINQ /实体框架请求。)
以下是包含默认目录的连接字符串示例:
data source=[Your server's address];initial catalog=[Your database CachedeskBase in your case];persist security info=[set to false if you plan on using sql authentification, else true];user id=[Your default user];password=[your user's password];MultipleActiveResultSets=True;App=EntityFramework
附注:在生产环境甚至开发环境中,您不应包含普通数据库用户名和密码。如果您计划部署此应用程序,我建议您查看ISS App Pools。使用应用程序池时,不要为应用程序指定用户,因此也不要为其密码指定用户。用户ID和密码字段由integrated security
标记
设置应用程序的数据库用户默认数据库:
建议不要执行此操作,因为您的用户应始终拥有不包含任何潜在危险数据的默认目录/数据库。这主要是为了安全,因为您希望在潜在入侵者的路径中添加障碍。使您的应用程序的数据库成为您用户的默认数据库不应该是您想要发生的事情。
由于我正在运行SQL服务器实例,我将使用SQL Server作为我的示例。
在SQL Server Management Studio中,转到security
文件夹,然后转到数据库对象编辑器的logins
文件夹中,然后双击您的用户。 (如果您使用的是IIS应用程序池,请查找IIS APPPOOL\[your app pool name]
)。
答案 1 :(得分:0)
您可能需要按照要求here指定datacontext的连接字符串。
Dim connectionString = "Data Source=myserver;Initial Catalog=mydatabasename;Integrated Security=True"
Using ctx As New HRManagerDataContext(connectionString))
Return (From us As User In ctx.Users
Where us.IsActive = True
Select us)
End Using