可能重复:
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
答案 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();
}
}