【发布时间】:2012-02-17 00:38:15
【问题描述】:
LINQ-to-SQL 对我来说是一个 PITA。我们使用它与数据库进行通信,然后通过 WCF 将实体发送到 Silverlight 应用程序。一切正常,直到开始编辑 (CUD) 实体及其相关数据。
我终于能够设计出两个允许 CUD 的 for 循环。我试图重构它们,我是如此接近,直到我了解到我不能总是用 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 需要是一个表达式>,这就是我遇到的问题。
有没有人可以告诉我这是否可能?由于 SharePoint 2010,我们必须使用 .NET 3.5。
【问题讨论】:
标签: c# linq-to-sql lambda expression-trees