LINQ-to-SQL a été un PITA pour moi. Nous l'utilisons pour communiquer avec la base de données, puis envoyer des entités via WCF à une application Silverlight. Tout fonctionnait bien, jusqu'à ce qu'il soit temps de commencer à éditer (CUD) les entités, et leurs données connexes.LINQ-to-SQL: Convertir Func <T, T, bool> en une expression <Func <T, T, bool>>
J'ai finalement réussi à concevoir deux boucles pour le CUD. J'ai essayé de les refactoriser, et j'étais si proche, jusqu'à ce que j'apprenne que je ne peux pas toujours faire Lambda avec 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);
}
}
}
Appelé par:
ctx.CudOperation<MyEntity>(myVar.MyEntities, newHeader.MyEntities,
(x, y) => x.PkID == y.PkID && x.Fk1ID == y.Fk1ID && x.Fk2ID == y.FK2ID);
Cela a presque fonctionné. Cependant, mon Func doit être une Expression>, et c'est là que je suis coincé.
Y a-t-il quelqu'un qui peut me dire si c'est possible? Nous devons être dans .NET 3.5 en raison de SharePoint 2010.
Porges, je vous remercie de la réponse rapide. Cependant, lorsque vous faites cela, et modifier ma clause .Where à ctx.GetTable() .Where (prédicat), je ne peux pas compiler. J'ai besoin de passer les deux variables (dont les propriétés doivent être comparées) à l'Expression/Func. –
DaleyKD
Ah, je vois, votre problème réel est dans la méthode. J'ai raté ça - je vais mettre à jour la réponse. – porges
Saint fume! Cela a totalement fonctionné. Nous reviendrons peut-être sur ce point pour les performances dans la version 1.1. ;) Je vous remercie! – DaleyKD