Comment couper les valeurs à l'aide de Linq to Sql?
Dans la base de données, j'ai une table appelée Contact. Le premier nom, et d'autres champs de type chaîne sont conçus pour utiliser un type de données Char (pas ma conception de base de données). Mon objet des cartes de Contact pour un type de chaîne dans les propriétés. Si je voulais faire un test simple de la récupération d'un objet Contact par id, je voudrais faire quelque chose comme ceci:
Contact contact = db.Contacts.Single(c => c.Id == myId);
Contact test = new Contact();
test.FirstName = "Martin";
Assert.AreEqual(test.FirstName, contact.FirstName);
Le contact.Valeur prénom est "Martin ", à cause du type char. Où puis-je intercepter le Prénom de la propriété quand il est chargé? OnFirstNameChanging(chaîne de valeur) n'est pas appelé sur le chargement initial (contact), mais sur l'objet de l'essai.
Vous pouvez le faire
contact.FirstName.Trim()
. J'ai vu quelques vieux code à moi, que j'ai besoin de mettre à jour maintenant. Voici la référence sur Canonique de la Chaîne de LINQ to SQL fonctions: docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/...OriginalL'auteur Marsharks | 2009-03-16
Vous devez vous connecter pour publier un commentaire.
Peut-être que vous pourriez le mettre dans la OnLoaded() partielle de la méthode? Note: je n'ai jamais utilisé, mais je suppose qu'il pourrait ressembler à ceci:
Cela va générer une propriété modifiée, ce qui pourrait déclencher d'autres actions -- et pourrait entraîner des mises à jour de la base de données puisque vous êtes à la modification de la valeur de la propriété, sans apporter de modifications sémantiques pour le contenu.
Le point de la question était de trouver l'endroit pour faire ce genre de logique (dans ce cas OnLoaded()); La méthode elle-même pourrait tout aussi bien consister en "_FirstName = _FirstName.Trim();" afin d'éviter les propery événement a changé de tir.
C'est probablement une bonne idée de ce dont j'ai besoin, car je ne peux pas changer le schéma de base de données. Je n'ai vraiment utiliser cette classe comme un objet de données pour stocker les valeurs d'un enregistrement de base de données. Ce serait bien si je pouvais avoir intercepté une propriété de chargement de l'événement, mais je ne peux pas.
Sachez que vous pouvez utiliser le OnLoad() méthode uniquement si le tableau correspondant à cette classe possède une clé primaire.
OriginalL'auteur Chris Shaffer
Si vous ne pouvez pas modifier le schéma, vous voudrez peut-être faire l'généré par le concepteur de l'accesseur privé/protégé et créer un accesseur public avant la fin de la propriété dans une classe partielle de la mise en œuvre. Vous pouvez ensuite découper la valeur dans l'accesseur get.
Le problème est que lorsque je crée une requête et essayez d'utiliser quelque chose comme FullName = c.Prenom + '' + c.LastName. J'ai fait le impossible de traduire l'expression et ne pouvait pas la traiter comme une expression locale de Message.
Une fois que vous avez fait de votre filtrage vous pouvez utiliser ToList() pour générer la requête réelle, puis faire votre sélectionnez sur la liste résultante. Puisqu'ils sont des objets à ce stade de la construction de FullName devrait fonctionner.
J'ai été en utilisant un peu de poids de l'objet, non pas de revenir une liste. Voici la ligne qui soufflait: Contact = loi.PhoneContact.Prenom + "" + loi.PhoneContact.LastName
OriginalL'auteur tvanfosson
Et vérifier que le fournisseur LINQ traduit en SQL.
Je pense que l'op prévu pour des exemples seulement à cause, de ne pas être pris à la lettre.
Vous avez lié à l'Entité SQL utilisé par Entity Framework qui utilise LINQ to entities. LINQ to SQL est utilisé par les anciens pré-EF ORM.
OriginalL'auteur Richard
Il repose sur le contrôle que vous avez sur le schéma et le code.
Si les valeurs sont en train d'être mis en place par l'appel d'un constructeur avec tous les paramètres, effectuez les garnitures, etc comme ils sont affectés aux variables membres.
S'ils sont affectés à l'propriétés (probablement à partir de l'exemple), changer l'accesseur SET de sorte qu'il ne la garniture.
Vous avez des problèmes potentiels si vous VOULEZ réellement leader ou les espaces à un certain point.
Si vous ne pouvez pas modifier la classe de base de code, essayez d'utiliser des classes partielles, ou hériter de la classe et en remplaçant les propriétés.
Si vous ne pouvez pas le faire, alors ma dernière suggestion serait d'écrire une classe factory de quelque sorte que vous passer un objet créé à et il il nettoie par les règles que vous souhaitez.
OriginalL'auteur Roger Willcocks
Vous pouvez exécuter une
ForEach
sur votre liste de contacts avant de tenter de la recherche pour Martin.Mais ce chemin n'est pas très facile à maintenir si, il faut le faire pour de multiples domaines.
OriginalL'auteur Samuel