【问题标题】:LINQ generates incomplete queryLINQ 生成不完整的查询
【发布时间】:2018-09-04 00:21:52
【问题描述】:

所以我有这个查询

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 会生成不完整的查询呢?

【问题讨论】:

  • 如果您必须指定数据库,则您连接到错误的数据库。另外,LINQ2SQL 和 Entity Framework 是不同的产品,请仅说明您正在使用的产品
  • 这只是 linq 生成的查询没有指定数据库名称,如果单击选择同一张表上的前 1000 行生成的查询包括数据库名称 linq 生成的一个没有。那我做错了什么?
  • @giorgi SSMS 可以包含它,因为当您右键单击表/视图并选择“查看前 1000 行”时,它知道该表属于哪个数据库。当您在查询中删除数据库指针时,它仍然可以工作,因为 SSMS 还将连接/脚本的默认数据库设置为同一个数据库。您可以通过查看 SSMS 窗口左上角的下拉菜单来查看/设置当前查询/连接/脚本指向的数据库。例如:imgur.com/a/Uuq4l。实体框架无法知道一张表属于哪个数据库。
  • 非常感谢 Guillaume Mercier 从下拉菜单更改数据库

标签: c# .net visual-studio entity-framework linq


【解决方案1】:

我知道可能导致您的问题的原因;

您应该检查您当前的连接字符串是否包含默认目录参数,并可能确保您的应用程序的数据库用户默认数据库已设置。


设置连接字符串中的初始目录/数据库变量:
您可能没有输入或忘记在连接字符串中包含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。使用应用程序池时,您无需为您的应用程序指定用户以及他们的密码。用户名和密码字段替换为integrated security标签


设置应用程序的数据库用户默认数据库:
不建议执行此操作,因为您应该始终为您的用户提供一个不包含任何潜在危险数据的默认目录/数据库。这主要是为了安全,因为您想在潜在入侵者的路径中添加障碍。让您的应用程序的数据库成为您用户的默认数据库不应该是您想要发生的事情。

由于我有一个 SQL Server 实例正在运行,因此我将使用 SQL Server 作为示例。

SQL Server Management Studio 中,转到security 文件夹,然后在您的数据库的对象编辑器的logins 文件夹中,双击您的用户。 (如果您使用的是 IIS 应用程序池,请查找 IIS APPPOOL\[your app pool name])。

这应该会打开登录属性窗口,允许您设置用户的默认数据库。

【讨论】:

    【解决方案2】:

    您可能需要按照here 的要求指定数据上下文的连接字符串。

    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
    

    【讨论】:

    • 通常,您在 app/web.config 中设置连接字符串并覆盖上下文中的默认构造函数以指向所述连接字符串。每次都必须设置它不仅很痛苦,而且还有很多重复的代码。示例:imgur.com/a/PXD74
    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多