C# Linq-按id从数据库中选择记录

C# Linq-按id从数据库中选择记录,c#,.net,linq,C#,.net,Linq,我正试图从数据库中获取一条具有我指定id的记录。但是,我在创建正确的Linq查询时遇到困难。 首先,这是我尝试过的两件事,但似乎不起作用 var query_result = from d in db.Departments where d.id == id select d; 在这里,我尝试选择遵循给定id的部门。但是在我的department类中,id属性是私有的。我希望保持这种方式,符合正常的OOP 在此之前,我

我正试图从数据库中获取一条具有我指定id的记录。但是,我在创建正确的Linq查询时遇到困难。 首先,这是我尝试过的两件事,但似乎不起作用

var query_result = from d in db.Departments
                   where d.id == id
                   select d;
在这里,我尝试选择遵循给定id的部门。但是在我的department类中,id属性是私有的。我希望保持这种方式,符合正常的OOP

在此之前,我尝试过这样做:

var query_result = from d in db.Departments
                   where d.getId() == id
                   select d;
在本例中,我使用getter作为id,但这会导致以下错误:

方法“Int32 getId”不支持到SQL的转换

我试着四处看看,但我似乎找不到一个结论性的答案,在我看来,这应该是非常简单的。我确实看到很多示例直接访问类属性,但这意味着将它们公开。除非我错过了什么,否则我真的不想走那条路


在这方面,我在Linq或c方面不是很有经验。提前感谢。

您当前的查询将返回一个列表。听起来你需要一张唱片?为此,请使用以下命令:

var recordDesired = db.Departments.FirstOrDefault(d => d.id == id);

假设“id”是某个地方定义的int,并且“id”属性也是int。是否有可能使用实体框架?如果是这样,我相信“id”属性需要同时具有公共getter和公共setter。我听说您没有将ID公开给您的终端客户端应用程序。一种方法是使用DTO的数据传输对象来转换数据库输出的所有优点,并将其包装在一个简单的类中,该类只公开最终应用程序关心的属性。

当前查询返回一个列表。听起来你需要一张唱片?为此,请使用以下命令:

var recordDesired = db.Departments.FirstOrDefault(d => d.id == id);

假设“id”是某个地方定义的int,并且“id”属性也是int。是否有可能使用实体框架?如果是这样,我相信“id”属性需要同时具有公共getter和公共setter。我听说您没有将ID公开给您的终端客户端应用程序。一种方法是使用DTO的数据传输对象来转换数据库输出的所有优点,并将其包装在一个简单的类中,该类只公开您的最终应用程序关心的属性。

如果您使用的是实体框架,则不能将get或set声明为private,否则实体框架也将无法访问它

这就是您要确保外部代码无法设置ID的原因:

public int Id { get; protected internal set; }

如果您使用的是实体框架,那么您不能将get或set声明为private,否则实体框架也无法访问它

这就是您要确保外部代码无法设置ID的原因:

public int Id { get; protected internal set; }

为什么身份证是私人的?如果你需要身份证,我不知道为什么它是私人的。它确实标识了记录。将getter设置为public,setter设置为private,而不是通常,如果需要,您只需将getter/setter用作id。这样,您就不能以不应该的方式更改id。当然,必须有一种方法来保持id私有,并为此使用getter?public int id{get;private set;}@Bono您已经发现了。您正在尝试将面向对象的封装实践与数据库结合起来。在同时使用Id查询数据库时,不能隐藏存在Id的事实。如果你真的不想让调用者知道ID,你需要生成一个单独的业务层和数据库层,这样只有数据库层看到ID,而业务层看不到。为什么ID是私有的?如果你需要身份证,我不知道为什么它是私人的。它确实标识了记录。将getter设置为public,setter设置为private,而不是通常,如果需要,您只需将getter/setter用作id。这样,您就不能以不应该的方式更改id。当然,必须有一种方法来保持id私有,并为此使用getter?public int id{get;private set;}@Bono您已经发现了。您正在尝试将面向对象的封装实践与数据库结合起来。在同时使用Id查询数据库时,不能隐藏存在Id的事实。如果您真的不想让调用者知道ID,那么您需要生成一个单独的业务层和数据库层,这样只有数据库层看到ID,而业务层看不到ID。