2009-05-23 7 views
0

Est-ce que quelqu'un a une idée sur la façon d'exécuter l'instruction suivante avec LINQ?Mises à jour LINQ to SQL

UPDATE FileEntity SET DateDeleted = GETDATE() WHERE ID IN (1,2,3) 

Je suis venu à la fois l'amour et la haine LINQ, mais jusqu'à présent, il y a eu peu qui n'a pas bien fonctionné. La solution évidente que je veux éviter est d'énumérer toutes les entités de fichiers et de les définir manuellement.

foreach (var file in db.FileEntities.Where(x => ids.Contains(x.ID))) 
{ 
    file.DateDeleted = DateTime.Now; 
} 
db.SubmitChanges(); 

problème Il le code ci-dessus, sauf pour les frais généraux non négligeable est que chaque entité a un champ de données qui peut être assez grand, donc pour une grande mise à jour beaucoup de pistes de données passent par la connexion de base de données sans particulier raison. (La solution LINQ consiste à retarder le chargement de la propriété Data, mais cela ne serait pas nécessaire s'il existait un moyen de mettre à jour le champ avec LINQ to SQL).

Je pense quelque chose de fournisseur d'expression de requête qui entraînerait ce qui précède T-SQL ...

Répondre

2

LINQ ne peut pas effectuer des mises à jour dans des magasins - c'est le langage de requête intégré, pas mise à jour. La plupart (ou peut-être même la totalité) des mappeurs OR généreront une instruction select pour extraire les données, les modifier en mémoire et effectuer la mise à jour à l'aide d'une instruction de mise à jour séparée. Les opérateurs OR intelligents récupèrent uniquement la clé primaire jusqu'à ce que des données supplémentaires soient requises, mais ils récupèrent généralement tout le reste car il serait très coûteux de ne récupérer qu'un seul attribut à la fois.

Si vous vous souciez vraiment de cette optimisation, utilisez une procédure stockée ou une instruction SQL manuscrite. Si vous voulez du code de compacter, vous pouvez utiliser ce qui suit. Je n'aime pas ça parce que je le trouve moins lisible, mais certains préfèrent une telle solution.

0

LINQ to SQL est un ORM, comme tout autre, et en tant que tel, il n'a pas été conçu pour gérer les mises à jour/insertions/suppressions en bloc. L'idée générale avec L2S, EF, NHibernate, LLBLGen et le reste est de gérer le mappage des données relationnelles à vos graphiques d'objets pour vous, éliminant le besoin de gérer une grande bibliothèque de processus stockés qui limite votre flexibilité et votre adaptabilité.

Quand il s'agit de mises à jour en vrac, il vaut mieux les laisser à leur meilleur ... le serveur de base de données. L2S et EF permettent tous deux de mapper des procédures stockées à votre modèle, ce qui permet à vos process stockés d'être quelque peu orientés vers l'entité. Depuis que vous utilisez L2S, écrivez simplement un proc qui prend l'ensemble des identités en entrée, et exécute l'instruction SQL au début de votre question. Faites glisser ce proc stocké sur votre modèle L2S, et appelez-le.

C'est la meilleure solution pour le problème à la main, qui est une mise à jour en vrac. Comme pour les rapports, les graphiques d'objets et le mappage relationnel objet ne sont pas la meilleure solution pour les processus en masse.