8,735
社区成员
发帖
与我相关
我的任务
分享
[OperationContract]
public Models.TMaster GetEntity(string masterKey)
{
using (Models.TestDataClassesDataContext db = new Models.TestDataClassesDataContext())
{
db.DeferredLoadingEnabled = false;
System.Data.Linq.DataLoadOptions option = new System.Data.Linq.DataLoadOptions();
option.LoadWith<Models.TMaster>(m => m.TDetail);
db.LoadOptions = option;
return db.TMaster.FirstOrDefault(m => m.MasterKey == masterKey);
}
}
[OperationContract]
public int UpdateWithTwoEntities(Models.TMaster current, Models.TMaster original)
{
using (Models.TestDataClassesDataContext db = new Models.TestDataClassesDataContext())
{
//db.DeferredLoadingEnabled = false;
db.TMaster.Attach(current, original);
this.ApplyCurrentAndOriginalValues(db, current , original);
db.SubmitChanges();
return 1;
}
}
/// <summary>
/// 将主表标识为已更改,同时判断子表的新增、删除、更改。
/// 在CSDN论坛上,有朋友说只需要一步db.TMaster.Attach(current, original);就可以完成
/// 对子表的更新,可是试了好久好久都没有试出来,不管如何,就算真的可以由DataContext
/// 自己完成对子表的新增、删除、更改的判断,知道要如何手工的去判断也未尝不是件好事。
/// </summary>
/// <param name="db"></param>
/// <param name="current"></param>
/// <param name="original"></param>
void ApplyCurrentAndOriginalValues(Models.TestDataClassesDataContext db,
Models.TMaster current, Models.TMaster original)
{
// 已被删除的子表数据
var deleteds = original.TDetail.Where(ori => !current.TDetail
.Any(d => d.DetailKey == ori.DetailKey && d.MasterKey == ori.MasterKey));
db.TDetail.AttachAll(deleteds);
db.TDetail.DeleteAllOnSubmit(deleteds);
// 新增加的子表数据
var inserteds = current.TDetail.Where(cur => !original.TDetail
.Any(d => d.DetailKey == cur.DetailKey && d.MasterKey == cur.MasterKey));
db.TDetail.InsertAllOnSubmit(inserteds);
// 要更新的子表数据
var updateds = current.TDetail.Where(cur => original.TDetail
.Any(d => d.DetailKey == cur.DetailKey && d.MasterKey == cur.MasterKey));
foreach (Models.TDetail upd in updateds)
{
db.TDetail.Attach(upd, original.TDetail.First(d =>
d.DetailKey == upd.DetailKey && d.MasterKey == upd.MasterKey));
}
}
[OperationContract]
public int UpdateWithCurrentEntity(Models.TMaster current)
{
// 在 LINQ to SQL 中,没有 DataContext.Detach() 方法,要将一个已附加的实体 Detach,
// 就只有序列化后再反序列化(即Clone)得到新的实体。
// 不过,还有一种方法可以“绕道”,那就是在另一个不同的 DataContext 中去得到实体
return this.UpdateWithTwoEntities(current, this.GetEntity(current.MasterKey));
}
exec sp_executesql N'UPDATE [dbo].[TDetail]
SET [DetailName] = @p6
WHERE ([DetailKey] = @p0) AND ([MasterKey] = @p1) AND ([DetailName] = @p2) AND ([Fa] = @p3) AND ([Fb] = @p4) AND ([Fc] = @p5)'
,N'@p0 varchar(4),@p1 varchar(4),@p2 varchar(4),@p3 int,@p4 varchar(4),@p5 datetime,@p6 varchar(4)'
,@p0='D001',@p1='Key1',@p2='DN A',@p3=100,@p4='Fb 1',@p5='2010-08-08 00:00:00:000',@p6='DN B'
exec sp_executesql N'UPDATE [dbo].[TDetail]
SET [DetailName] = @p2
WHERE ([DetailKey] = @p0) AND ([DetailKey] = @p1)'
,N'@p0 varchar(4),@p1 varchar(4),@p2 varchar(4)',@p0='D001',@p1='D001',@p2='DN C'
using (DbEntities db = new DbEntities())
{
var objs = db.TMaster;
var objs1 = objs.Where(c => c.MasterKey == "en");
var objs2 = objs1.Where(c => c.MasterName.StartsWith("E"));
objs2.ToArray();
db.TMaster.Where(c => c.MasterKey == "en").Where(c => c.MasterName.StartsWith("E")).ToArray();
db.TMaster.Where(c => c.MasterKey == "en" && c.MasterName.StartsWith("E")).ToArray();
}