0

重複の可能性:
LINQ Single と First

私はLinqを初めて使用し、最善の方法で学びたいと思っています.linqの2つの作業更新イベントがあります.同じことをします.

解決策 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)

テストされていませんが、最初またはデフォルトでラムダが処理されることを指摘する必要があります

どちらを使用するかは、データによって異なります。何が起こるかを分解するには

シングル - 1 つの一致が期待されます。結果が見つからない場合、または複数の結果が見つかった場合は、例外がスローされます。

SingleOrDefault - 0 または 1 つの一致が予想されます。複数の一致が見つかった場合、例外がスローされます

最初 - 1 つ以上の一致が予想されます。一致するものが見つからない場合、例外がスローされます。最初の結果以降の結果は無視されます。

FirstOrDefault - 0、1、または複数の一致を処理します。最初の結果以降の結果は無視されます。

リストボックスからの ID に基づいて選択する場合 (つまり、一意であり、データベース内に確実に存在する場合)、single が安全な選択です。

ユーザーが ID (ここでも一意) を入力している場合、その ID は DB にある場合とない場合があります。単一またはデフォルトが安全です。

姓などの重複する可能性のある値に基づいて検索する場合は、データベースに存在することが保証されているかどうかに応じて、first または firstordefault を使用する必要があります。

個人的には、データに関係なく、より多くのシナリオを処理できるので、first または firstordefault のいずれかに固執します。

于 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 に答える