0

可能重复:
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
4

2 回答 2

4

首先,您应该能够将您的第一个或默认值写为

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

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

至于用哪个,就看你的数据了。分解发生的事情

单一 - 只需要一个匹配项,如果没有找到结果或找到多个结果,则会引发异常

SingleOrDefault - 期望 0 或 1 个匹配项。如果找到多个匹配项,则会引发异常

First - 期望 1 个或多个匹配项。如果未找到匹配项,则会引发异常。第一个结果之后的任何结果都将被忽略。

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

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

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

如果基于可能的重复值(例如姓氏)进行搜索,则应该使用 first 或 first 或 default ,具体取决于它是否保证存在于数据库中。

就个人而言,无论数据如何,我都会坚持使用 first 或 first 或 default ,因为它可以处理更多场景。

于 2012-09-24T10:02:39.477 回答
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 层可以如下所示:

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

       db.MyObjects.Attach(obj);

       db.Refresh(RefreshMode.KeepCurrentValues, obj);

       db.SubmitChanges();
    }
}
于 2012-09-24T09:48:31.097 回答