Vb.net Single和FirstOrDefault之间有什么区别?
可能重复:Vb.net Single和FirstOrDefault之间有什么区别?,vb.net,linq-to-sql,Vb.net,Linq To Sql,可能重复: 我是Linq的新手,希望以最好的方式学习它,我这里有两个Linq的工作更新事件,他们也会这样做,但是什么方式是最好的,我需要添加一些东西来让它更好 解决方案1 Protected Sub Button2_Click(sender As Object, e As System.EventArgs) Handles Button2.Click Using db As New ThedatabaseconnectionDataContext() Try
我是Linq的新手,希望以最好的方式学习它,我这里有两个Linq的工作更新事件,他们也会这样做,但是什么方式是最好的,我需要添加一些东西来让它更好 解决方案1
Protected Sub Button2_Click(sender As Object, e As System.EventArgs) Handles Button2.Click
Using db As New ThedatabaseconnectionDataContext()
Try
Dim TheUpdateID = DirectCast(FindControl("Textbox5"), TextBox).Text
Dim getEditing As testtable = (From c In db.testtables Where c.test_id = TheUpdateID Select c).FirstOrDefault()
If getEditing IsNot Nothing Then
getEditing.test_cat = DirectCast(FindControl("Textbox1"), TextBox).Text
getEditing.test_info = DirectCast(FindControl("Textbox2"), TextBox).Text
getEditing.test_number = DirectCast(FindControl("Textbox3"), TextBox).Text
getEditing.test_datetime = DirectCast(FindControl("Textbox4"), TextBox).Text
db.SubmitChanges()
'textBox1.Text = "Contact updated."
End If
Catch ex As Exception
'Me.lblMsg.Text = ex.Message
End Try
End Using
End Sub
解决方案2
Protected Sub Button2_Click(sender As Object, e As System.EventArgs) Handles Button2.Click
Using db As New ThedatabaseconnectionDataContext()
Try
Dim tbltest As Table(Of testtable) = db.GetTable(Of testtable)()
Dim TheUpdateID = DirectCast(FindControl("Textbox5"), TextBox).Text
Dim getEditing As testtable = tbltest.Single(Function(c) c.test_id = TheUpdateID)
If getEditing IsNot Nothing Then
getEditing.test_cat = DirectCast(FindControl("Textbox1"), TextBox).Text
getEditing.test_info = DirectCast(FindControl("Textbox2"), TextBox).Text
getEditing.test_number = DirectCast(FindControl("Textbox3"), TextBox).Text
getEditing.test_datetime = DirectCast(FindControl("Textbox4"), TextBox).Text
db.SubmitChanges()
'textBox1.Text = "Contact updated."
End If
Catch ex As Exception
'Me.lblMsg.Text = ex.Message
End Try
End Using
End Sub
从哪里开始呢 首先,我知道这可能是一个测试项目,所以如果您已经在这样做,很抱歉,但请确保您使用的是可接受的数据层层次结构-您的DBML应该位于与表示层分离的项目中 但是,对于手头的问题。我的首选方法是获取数据对象并在对象级别上更新它。比如(伪代码/我是个C#类人!): 这利用了对象跟踪,然后Daya层可以如下所示:
function void UpdateObject(MyObject obj)
{
using (TestDataContext db = new TestDataContext ())
{
db.MyObjects.Attach(obj);
db.Refresh(RefreshMode.KeepCurrentValues, obj);
db.SubmitChanges();
}
}
从哪里开始呢 首先,我知道这可能是一个测试项目,所以如果您已经在这样做,很抱歉,但请确保您使用的是可接受的数据层层次结构-您的DBML应该位于与表示层分离的项目中 但是,对于手头的问题。我的首选方法是获取数据对象并在对象级别上更新它。比如(伪代码/我是个C#类人!): 这利用了对象跟踪,然后Daya层可以如下所示:
function void UpdateObject(MyObject obj)
{
using (TestDataContext db = new TestDataContext ())
{
db.MyObjects.Attach(obj);
db.Refresh(RefreshMode.KeepCurrentValues, obj);
db.SubmitChanges();
}
}
首先,您应该能够将您的第一个或默认值写为
Dim getEditing As testtable = tbltest.FirstOrDefault(Function(c) c.test_id = TheUpdateID)
未经测试,但需要指出的是,first或default处理lambda
至于使用哪一种,这取决于你的数据。分解发生的事情
Single-只需要一个匹配项,如果没有,则引发异常
找到结果或找到多个结果
单缺省-
需要0或1个匹配项。如果存在多个匹配项,则引发异常
发现
第一-期望1个或多个匹配。如果没有,则引发异常
找到匹配项。第一个结果之后的任何结果都将被忽略
FirstOrDefault-处理0、1或多个匹配项。第一个结果之后的任何结果都将被忽略
如果您是根据列表框中的ID进行选择(即,它是唯一的,并且在数据库中是明确的),那么选择single是安全的
如果用户输入的ID(也是唯一的)可能在DB single中,也可能不在DB single中,则默认值是安全的
如果基于可能的重复值(如姓氏)进行搜索,则应使用first或firstordefault,具体取决于是否保证该值存在于数据库中
就我个人而言,无论数据如何,我都会坚持使用first或firstordefault,因为它可以处理更多的场景。首先,您应该能够将您的第一个或默认值写为
Dim getEditing As testtable = tbltest.FirstOrDefault(Function(c) c.test_id = TheUpdateID)
未经测试,但需要指出的是,first或default处理lambda
至于使用哪一种,这取决于你的数据。分解发生的事情
Single-只需要一个匹配项,如果没有,则引发异常
找到结果或找到多个结果
单缺省-
需要0或1个匹配项。如果存在多个匹配项,则引发异常
发现
第一-期望1个或多个匹配。如果没有,则引发异常
找到匹配项。第一个结果之后的任何结果都将被忽略
FirstOrDefault-处理0、1或多个匹配项。第一个结果之后的任何结果都将被忽略
如果您是根据列表框中的ID进行选择(即,它是唯一的,并且在数据库中是明确的),那么选择single是安全的
如果用户输入的ID(也是唯一的)可能在DB single中,也可能不在DB single中,则默认值是安全的
如果基于可能的重复值(如姓氏)进行搜索,则应使用first或firstordefault,具体取决于是否保证该值存在于数据库中
就个人而言,无论数据如何,我都会坚持使用first或firstordefault,因为它可以处理更多的场景。MyObject是在同一页上还是在类文件上!?你在哪里指出要更新的ID!?MyObject是DBML将自动生成的类。比如说,若您的表名为“Files”,那个么您将自动生成名为“File”的类,实体框架将跟踪该类。选择对象的ID可以在页面加载注释中看到。MyObject是在同一页面上还是在类文件上!?你在哪里指出要更新的ID!?MyObject是DBML将自动生成的类。比如说,若您的表名为“Files”,那个么您将自动生成名为“File”的类,实体框架将跟踪该类。可以在页面加载注释中看到选择对象的ID。可能会添加:“FirstOrDefault-处理0、1或多个匹配”-但会忽略第一个之后的任何内容match@HansKesting很好的一点,修改了我的答案很好的答案……只是一个补充,如果我有你推荐的……Dim tbltest As Table(Of testtable)=db.GetTable(关于testtable)Dim TheUpdateID=DirectCast(FindControl(“Textbox5”),TextBox.Text Dim getEditing As testtable=tbltest.FirstOrDefault(函数(c)c.test\u id=TheUpdateID)如果我的表名为testtable和maintable,并且我想从maintable获取信息,其中main_id=test_id!?@ThomasBøgPetersen我不确定我是否理解你的意思Hej Manatherin,我的意思是如何制作(在本例中)Dim tdltest如果我有这个从两个表获取信息的旧sql查询…..Dim cmd作为新的SqlCommand(“选择组。名称来自角色的内部联接组。组ID=组。组ID来自角色的内部联接用户。用户ID=用户。用户ID和用户。用户名=@Username”,conn)可能需要添加一条:“FirstOrDefault-处理0、1或多个匹配”-但忽略第一个匹配之后的任何内容match@HansKesting很好的一点,修改了我的答案很好的答案…只是一个补充,如果我有你推荐的这个…。将tbltest作为表格(的