日期:2014-05-18  浏览次数:20822 次

新手问个关于Linq to SQL的问题
问题有点长,还劳烦各位大牛们看下。

首先贴下测试表:
C# code

    [Table(Name = "tbl_users")]
    public class User
    {
        #region Attributes
        [Column(Name = "uId", IsDbGenerated = true, IsPrimaryKey = true)]
        public int Id { get; set; }

        [Column(Name = "uName", CanBeNull = false)]
        public string Name { get; set; }
        #endregion
    }



用Log可以查到进行常规的添加或查找操作Linq to SQL都会生成一条语句进行查询,例如:
C# code

            DataContext con = new DataContext(Common.CONNSTR);
            con.GetTable<User>().InsertOnSubmit(new User() { Name = "王三" });
            con.SubmitChanges();
            con.Dispose();
对应T-Sql:
insert into tbl_users(uName) values('王三')

            try
            {
                return (new DataContext(Common.CONNSTR).GetTable<User>().Single(u => u.Id == 6 && u.Name == "王二"));
            }
            catch
            {
                return (null);
            }
对应T-Sql:
select * from tbl_users where uId=6 and uName='王二'


但是对应常规的删、改操作则会分别生成两条语句进行查询:
C# code

            DataContext con = new DataContext(Common.CONNSTR);
            con.GetTable<User>().Single(u => u.Id == 6 && u.Name == "王三").Name = "王二";
            con.SubmitChanges();
            con.Dispose();
对应T-Sql:
select * from tbl_users where uId=6 and uName='王三'
update tbl_users set uName='王二' where uId=6 and uName='王三'

            DataContext con = new DataContext(Common.CONNSTR);
            con.GetTable<User>().DeleteOnSubmit(con.GetTable<User>().Single(u => u.Id == 6));
            con.SubmitChanges();
            con.Dispose();
对应T-Sql:
select * from tbl_users where uId=6
delete tbl_users where uId=6 and uName=(上一句查到的值)


由于篇幅关系,上面的SQL语句都写成化简后的形式。

问题就是,除了ExecuteCommand以外,还有没有别的办法让删改操作像ADO一样只用一个查询完成?
C# code

修改:
                con.ExecuteCommand("update tbl_users set uName={0} where uId={1} and uName={2}", "王二", 6, "王三");

删除:
                con.ExecuteCommand("delete tbl_users where uId={0}", 6);



------解决方案--------------------
这个。。。LINQ2SQL 
在UPATE和DELETE操作前,必需要先获取数据再进行后续操作

------解决方案--------------------
如果是 nhibernate,删除可以一条语句,修改仍然要先查后改。linq2sql不熟。其实这里没有太大的性能损失,不用太纠结。
------解决方案--------------------
我想它这样设计也是有一定道理的,
ORM最重要的是对象,删除和修改首先应该得到此对象,再执行操作.
所有它先查询此对象,然后执行删除和修改操作.
------解决方案--------------------
如果你认为ADO.NET方法跟简练,为什么不同时使用呢?

其实就是有些人过于死板的原因,硬说“学会了Linq to SQL的话,再使用ADO.NET就显得麻烦了”。这是懒惰或者就是幼稚。对于很基本的东西,我完全支持不同的人使用不同的方法来操作数据库,没有必要要求所有人都只允许使用一种(美其名曰“统一”的)方法。
------解决方案--------------------
探讨
引用:

需要修改linq to sql的底层
可以直接实现更新,删除


博客园:赵劼有相关文章
不过我是实现,但还是看赵劼的文章做的。

有点感兴趣,不知是否可以提供下链接。