LINQ-to-SQL ha sido un PITA para mí. Lo estamos usando para comunicarnos a la base de datos, y luego enviar entidades a través de WCF a una aplicación de Silverlight. Todo funcionaba bien, hasta que llegó el momento de comenzar a editar (CUD) las entidades y sus datos relacionados.LINQ-to-SQL: Convertir Func <T, T, bool> en una expresión <Func <T, T, bool>>
Finalmente pude diseñar dos bucles para permitir el CUD. Traté de refactorizarlos, y estaba tan cerca, hasta que supe que no siempre puedo hacer Lambda con 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);
}
}
}
Llamado por:
ctx.CudOperation<MyEntity>(myVar.MyEntities, newHeader.MyEntities,
(x, y) => x.PkID == y.PkID && x.Fk1ID == y.Fk1ID && x.Fk2ID == y.FK2ID);
Esta casi funcionó. Sin embargo, mi Func necesita ser una Expresión>, y ahí es donde estoy atascado.
¿Hay alguien que pueda decirme si esto es posible? Tenemos que estar en .NET 3.5, debido a SharePoint 2010.
Porges, agradezco la pronta respuesta. Sin embargo, cuando haces eso, y cambias mi cláusula .Where a ctx.GetTable() .Where (predicado), no puedo compilar. Necesito pasar las dos variables (que deben comparar sus propiedades) a Expression/Func. –
DaleyKD
Ah, ya veo, su problema real está dentro del método. Me perdí eso, actualizaré la respuesta. – porges
Holy smokes! Eso funcionó por completo. Tal vez volvamos a visitar esto para el rendimiento en la versión 1.1. ;) ¡Gracias! – DaleyKD