LINQ-to-SQL là PITA cho tôi. Chúng tôi đang sử dụng nó để giao tiếp với cơ sở dữ liệu, và sau đó gửi các thực thể thông qua WCF đến một ứng dụng Silverlight. Tất cả mọi thứ đã được làm việc tốt, cho đến khi nó đến thời gian để bắt đầu chỉnh sửa (CUD) các thực thể, và dữ liệu liên quan của họ.LINQ-to-SQL: Chuyển đổi Func <T, T, bool> thành Biểu thức <Func <T, T, bool>>
Tôi cuối cùng đã có thể đưa ra hai vòng cho phép CUD. Tôi đã cố gắng tái cấu trúc chúng, và tôi đã rất gần gũi, cho đến khi tôi biết rằng tôi không thể luôn làm Lambda với L2S.
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);
}
}
}
gọi theo:
ctx.CudOperation<MyEntity>(myVar.MyEntities, newHeader.MyEntities,
(x, y) => x.PkID == y.PkID && x.Fk1ID == y.Fk1ID && x.Fk2ID == y.FK2ID);
này gần như làm việc. Tuy nhiên, Func của tôi cần phải là một biểu thức>, và đó là nơi tôi bị mắc kẹt.
Có ai có thể cho tôi biết nếu điều này là có thể không? Chúng ta phải trong .NET 3.5 do SharePoint 2010.
Porges, tôi đánh giá cao sự trả lời nhanh chóng. Tuy nhiên, khi bạn làm điều đó, và thay đổi điều khoản của tôi .Where để ctx.GetTable() .Where (predicate), tôi không thể biên dịch. Tôi cần phải vượt qua hai biến (mà cần phải có tài sản của họ so sánh) với Expression/Func. –
DaleyKD
Ah, tôi hiểu, vấn đề thực tế của bạn nằm trong phương thức. Tôi đã bỏ lỡ điều đó - tôi sẽ cập nhật câu trả lời. – porges
Hút thuốc lá! Điều đó hoàn toàn hiệu quả. Có lẽ chúng tôi sẽ xem lại điều này cho hiệu suất trong phiên bản 1.1. ;) Cảm ơn bạn! – DaleyKD