Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net Single和FirstOrDefault之间有什么区别?_Vb.net_Linq To Sql - Fatal编程技术网

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作为表格(的