【问题标题】:What is the difference between Single and FirstOrDefault? [duplicate]Single 和 FirstOrDefault 有什么区别? [复制]
【发布时间】:2012-09-24 09:40:17
【问题描述】:

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

【问题讨论】:

标签: vb.net linq-to-sql


【解决方案1】:

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

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

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

至于使用哪个,这取决于您的数据。分解发生的事情

Single - 只需要一个匹配项,如果没有则抛出异常 找到结果或找到多个结果

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

First - 需要 1 个或多个匹配项。如果没有则抛出异常 找到匹配项。第一个结果之后的任何结果都将被忽略。

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

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

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

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

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

【讨论】:

  • 可能添加:'FirstOrDefault - 处理 0、1 或多个匹配' - 但在第一个匹配后忽略任何内容
  • @HansKesting 好点,修改了我的答案
  • 很好的答案......只是一个补充,如果我有这个你推荐............将 tbltest 作为 Table(Of testtable) = db.GetTable(Of testtable )() Dim TheUpdateID = DirectCast(FindControl("Textbox5"), TextBox).Text Dim getEditing As testtable = tbltest.FirstOrDefault(Function(c) c.test_id = TheUpdateID) 如果我的表名称为 testtable 和maintable 我想从 maintable 获取信息,其中 main_id = test_id !?
  • @ThomasBøgPetersen 我不确定我理解你的意思
  • Hej Manatherin,我的意思是,如果我有这个从 2 个表中获取信息的旧 sql 查询,我该如何制作(在这种情况下)Dim tdltest ..... Dim cmd As New SqlCommand(" SELECT Groups.Name FROM Roles INNER JOIN Groups ON Roles.GroupID = Groups.GroupID INNER JOIN Users ON Roles.UserID = Users.UserID AND Users.Username=@UserName", conn)
【解决方案2】:

从哪里开始...

首先,我知道这可能是一个测试项目,所以如果您已经这样做了,我们深表歉意,但请确保您使用的是可接受的数据层层次结构 - 您的 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();
    }
}

【讨论】:

  • MyObject 是在同一页面上还是在类文件上!?你在哪里指出要更新什么ID!?
  • MyObject 是您的 DBML 将生成的自动生成的类。比如说,如果您的表名为“Files”,那么您将自动生成名为“File”的类,Entity Framework 将在其中跟踪。可以在 Page_Load 注释中看到选择对象的 ID。
猜你喜欢
  • 2023-03-13
  • 2011-12-01
  • 2015-11-23
  • 2013-02-13
  • 2011-04-26
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多