LINQ-to-SQL对我来说一直是个大麻烦。我们使用它与数据库通信,然后通过WCF将实体发送到Silverlight应用程序。一切都很好,直到开始编辑(CUD)实体及其相关数据时出现问题。
最终,我设计出两个for循环允许进行CUD操作。我试图对它们进行重构,但我很快就发现我不能总是在L2S中使用Lambda表达式。
这几乎行得通。然而,我的Func需要是一个Expression>,这就是我卡住的地方。
有人能告诉我这是否可能吗?由于SharePoint 2010,我们必须使用.NET 3.5。
最终,我设计出两个for循环允许进行CUD操作。我试图对它们进行重构,但我很快就发现我不能总是在L2S中使用Lambda表达式。
public static void CudOperation<T>(this DataContext ctx, IEnumerable<T> oldCollection, IEnumerable<T> newCollection, Func<T, T, bool> predicate)
where T : class
{
foreach (var old in oldCollection)
{
if (!newCollection.Any(o => predicate(old, o)))
{
ctx.GetTable<T>().DeleteAllOnSubmit(ctx.GetTable<T>().Where(o => predicate(old, o)));
}
}
foreach (var newItem in newCollection)
{
var existingItem = oldCollection.SingleOrDefault(o => predicate(o, newItem));
if (existingItem != null)
{
ctx.GetTable<T>().Attach(newItem, existingItem);
}
else
{
ctx.GetTable<T>().InsertOnSubmit(newItem);
}
}
}
调用者:
ctx.CudOperation<MyEntity>(myVar.MyEntities, newHeader.MyEntities,
(x, y) => x.PkID == y.PkID && x.Fk1ID == y.Fk1ID && x.Fk2ID == y.FK2ID);
这几乎行得通。然而,我的Func需要是一个Expression>,这就是我卡住的地方。
有人能告诉我这是否可能吗?由于SharePoint 2010,我们必须使用.NET 3.5。