Single和FirstOrDefault有什么区别?

时间:2012-09-24 09:40:18

标签: vb.net linq-to-sql

  

可能重复:
  LINQ Single vs First

我是Linq的新手并希望以最好的方式学习它,我在这里有2个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

2 个答案:

答案 0 :(得分:4)

首先,你应该可以写第一个或默认为

Dim getEditing As testtable = tbltest.FirstOrDefault(Function(c) c.test_id = TheUpdateID)

未经测试但更多要指出第一个或默认处理lambdas

至于使用哪个,取决于您的数据。要打破发生的事情

  

单一 - 预计只有一个匹配,否则抛出异常   找到结果或找到多个结果

     

SingleOrDefault -   预期0或1匹配。如果有多个匹配项,则抛出异常   找到了

     

首先 - 预计1或多场比赛。如果没有,则抛出异常   找到匹配。第一个结果后的任何结果都将被忽略。

     

FirstOrDefault - 处理0,1或多个匹配。第一个结果后的任何结果都将被忽略。

如果您根据列表框中的ID进行选择(即,它是唯一的并且绝对在数据库中),那么单个是安全的选择。

如果用户输入的ID(也是唯一的)可能是也可能不在数据库中,或者默认是安全的。

如果根据可能的重复值(如姓氏)进行搜索,那么首先应该使用first或firstordefault,这取决于它是否保证在数据库中存在。

就个人而言,无论数据如何,我都会坚持使用第一次或第一次失败,因为它会处理更多场景。

答案 1 :(得分:0)

从哪里开始......

首先,我知道这可能是一个测试项目,如果您已经这样做了,请道歉,但请确保您使用的是可接受的数据层层次结构 - 您的DBML应该与您的演示文稿位于一个单独的项目中层

但是,对于手头的问题。我这样做的首选方法是获取数据对象并在对象级别更新它。比如(伪代码/我是C#有点家伙!):

private MyObject object;

protected void Page_Load(object sender, EventArgs e)
{
    // Select usually be ID
    object = DataLayer.GetObject();

    if(!IsPostBack)
    {
         // Load object details for editing into presentation layer
         TextboxObjectName.Text = object.Name;
    }
}

protected void Button_Click(object sender, EventArgs e)
{
     // Button click event - update object and send it to database
     object.Name = TextboxObjectName.Text;

     DataLayer.UpdateObject(object);
}

这使用对象跟踪,然后Daya Layer可以如下所示:

function void UpdateObject(MyObject obj)
{
    using (TestDataContext db = new TestDataContext ())
    {

       db.MyObjects.Attach(obj);

       db.Refresh(RefreshMode.KeepCurrentValues, obj);

       db.SubmitChanges();
    }
}