Outils pour utilisateurs

Outils du site


developpement:dotnet:linq:linq-to-sql:introduction

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
developpement:dotnet:linq:linq-to-sql:introduction [2015/08/01 01:42] – modification externe 127.0.0.1developpement:dotnet:linq:linq-to-sql:introduction [2022/03/15 14:51] (Version actuelle) – supprimée sgariepy
Ligne 1: Ligne 1:
-====== LINQ to SQL ====== 
-Cette page s'intéresse particulièrement au **LINQ to %%SQL%%** (LTS) qui interagit avec une système de gestion de bases de données **%%SQL%% Server**.  Les exemples utilisent la base de données //AdventureWorks//((http://www.codeplex.com/Wikipage?ProjectName=SqlServerSamples)). 
  
-===== Prise en main rapide ===== 
- 
-Pour créer une simple application utilisant LINQ to SQL, voici les étapes : 
- 
-  - Créer une application (console, Windows Form, WPF ou ASP.NET) avec Visual Studio 2008. 
-  - Afficher l'**Explorateur de serveurs** et ajouter une connexion à la base de données (ie: //AdventureWorks//). 
-  - Ajouter un nouvel élément au projet : **Classes LINQ to SQL**.  Donner un nom approprié (ie : ''AdventureWorks.dbml''). 
-  - Eclater la liste des tables de la base de données et glisser-déposer une table dans le fichier DBML (ie : ''Department'' dans ''AdventureWorks.dbml''). 
-    * Pour les exemples avec //AdventureWorks//, insérer également les tables ''Employee'', ''Contact'' et ''EmployeeDepartmentHistory''. 
-    * Idéalement toutes les clés étrangères ont été créés dans la BD, ce qui crée automatiquement les associations.  Sinon, il est possible de créer les associations dans le designer DBML, mais il peut y avoir des problèmes d'intégrité, de requêtes, etc. 
-  - Ajouter, par glisser-déposer, les procédures stockées (//sproc//) nécessaires au panneau de méthodes du designer DBML. 
-    - Ajouter les sprocs directement sur l'entité si elle est spécifique à celle-ci. 
- 
- 
-{{:bd:sqlserver:linq_dbml_designer.png?460|}} 
- 
-===== Syntaxe illustrée ===== 
-{{:bd:sqlserver:linqsyntax.png?400|}} 
- 
-Source : [[http://www.albahari.com/nutshell/linqsyntax.aspx|LINQ: Query Comprehension Syntax]] 
- 
-====== Requêtes CRUD ====== 
- 
-Les exemples de code suivants ont besoin de la déclaration de ''db'' pour bien fonctionner.  Il s'agit en fait de créer l'objet ''DataContext'' que nous utiliseront.  Le ''DataContext'' est l'interface entre l'application et la base de données. 
- 
-<code csharp> 
-AdventureWorksDataContext db = new AdventureWorksDataContext(); 
-</code> 
- 
-Autre exemple qu'il est possible d'utiliser, mais non testé : 
-<code csharp> 
-AdventureWorksDataContext db = new AdventureWorksDataContext (@"Data Source=.\SQLEXPRESS;Initial Catalog=AdventureWorks"); 
-</code> 
- 
-Aussi, il est préférable d'entourer les opérations LINQ avec un ''try catch''. 
- 
-<code csharp> 
-try 
-{ 
-    // code LINQ... 
-} 
-catch (Exception ex) 
-{ 
-    throw ex; 
-} 
-</code> 
- 
-===== Retrouver ===== 
-Les requêtes pour retrouver les données sont simples.  Il peut y avoir des questions de performances et d'optimisation, mais il n'en sera pas question ici. 
- 
-==== Exemples de requêtes ==== 
- 
-<code csharp> 
-var p =  (from em in db.Employees 
-          join edh in db.EmployeeDepartmentHistories 
-          on em.HireDate equals edh.StartDate 
-          where em.EmployeeID == edh.EmployeeID 
-          select new 
-          { 
-              em.EmployeeID, 
-              Date = edh.StartDate 
-          }).ToList(); 
-</code> 
- 
-Retrouver des enregistrements en précisant les Ids dans un tableau (''OrgIds'') : 
-<code csharp> 
-List<Personnel> query =  
-    (from p in this.Database.Personnels  
-    where OrgIds.Contains(p.OrgID) select p).ToList(); 
-</code> 
- 
-=== Limiter le nombre de résultats === 
-<code csharp> 
-results = (from e in Employee 
-           orderby e.Id descending 
-           select e).Take(5).ToList(); 
-</code> 
- 
- 
- 
- 
-==== Retrouver un seul enregistrement ==== 
-<code csharp> 
-public Product GetProduct(int productID) 
-{ 
-    AdventureWorksDBDataContext db = new AdventureWorksDBDataContext(); 
-    Product product = db.Products.Single(p => p.ProductID == productID); 
-    return product; 
- 
-</code> 
- 
- 
-==== Assigner null à des colonnes ==== 
- 
-<code> 
-La valeur null ne peut pas être assignée à un membre de type System.Int32, car il s'agit d'un type valeur non nullable. 
-</code> 
- 
-Quand on crée un objet anonyme lors de la sélection LINQ-to-SQL, les int sont non nullables.  Voici un exemple qui permet de les rendre nullable. 
- 
-<code csharp> 
-var employe = from e in EMPLOYEs 
-              join fe in DOCUMENTs on uc.FORMULAIRE_EMBAUCHE_PK equals fe.DOCUMENT_PK into tempFE 
-       from tfe in tempFE.DefaultIfEmpty() 
-              select new { 
-                  Nom = e.NOM, 
-                  Prenom = e.PRENOM, 
-                  FormulaireNom = tfe.NOM, 
-                  FormulaireId = (int?) tfe.DOCUMENT_ID 
-              }; 
-</code> 
- 
-==== Utiliser une valeur possiblement null dans une clause Where ==== 
- 
-Si on veut spécifier une valeur possiblement ''null'' dans une clause ''where'', il faut utiliser ''object.Equals()'' Comme ça, si la valeur est nulle, la requête SQL contiendra ''WHERE NOM_COLONNE IS NULL'', au lieu de ''WHERE NOM_COLONNE = NULL''. 
- 
-<code csharp> 
-public static List<Employe> GetEmploye(int? personneId) 
-{ 
-    using (DataContext db = new DataContext()) 
-    { 
-        var employes = from e in db.EMPLOYES 
-                       where object.Equals(e.PersonneId, personneId) 
-                       select e; 
-    } 
-    // etc 
-} 
-</code> 
- 
- 
-==== Sous-requêtes ==== 
-L'expression LINQ ''query.Any(x => predicate)'' est équivalente en SQL à : 
- 
-<code sql> 
-EXISTS( 
-    SELECT * 
-    FROM query 
-    WHERE predicate 
-    ) 
-</code> 
- 
-Par exemple, cette requête : 
-<code csharp> 
-from c in db.Customers 
-where db.Employees.Any(e => e.City == c.City) 
-select c; 
-</code> 
- 
- 
-<code csharp> 
-var subquery = from product in MySandbox.Products 
-where product.Supplier.City.StartsWith("M") 
-select product.CategoryID; 
- 
-var query = from category in MySandbox.Categories 
-where 
-  category.CategoryName.Contains("y") 
-  && subquery.Contains(category.CategoryID) 
-select category; 
-</code> 
- 
- 
-==== DataLoadOptions ==== 
- 
-L'extension du [[divers:glossaire#cadriciel|cadriciel]] LINQ a été construit pour utiliser le principe du //lazy loading// Il peut être nécessaire de changer ce comportement avec ''DataLoadOptions'' Dans l'exemple suivant, les informations sur le contact de l'employé seront également chargés.  Il faut faire attention aux relations de un à plusieurs (1:n) entre les entités qui peuvent apporter des problèmes de performances. 
- 
-<code csharp> 
-System.Data.Linq.DataLoadOptions options = new System.Data.Linq.DataLoadOptions(); 
-options.LoadWith<Employee>(emp => emp.Contact); 
-db.LoadOptions = options; 
-Employee x = db.Employees.Single(r => r.EmployeeID == 1); 
-Debug.Print(x.Contact.FirstName); 
-</code> 
- 
-==== AssociateWith ==== 
- 
-<code csharp> 
-System.Data.Linq.DataLoadOptions options = new System.Data.Linq.DataLoadOptions(); 
-options.AssociateWith<Employee>(c => c.EmployeeDepartmentHistories.Where 
-                                (r=>r.StartDate > new DateTime(2000,10,31))); 
-db.LoadOptions = options; 
-foreach (Employee emp in db.Employees) 
-{ 
-    foreach (EmployeeDepartmentHistory edh in emp.EmployeeDepartmentHistories) 
-    { } 
-} 
-</code> 
-==== Concaténation et jointure ==== 
-Le code suivant montre comment créer une requête LINQ un peu plus //complexe// lors de l'événement ''Selecting'' d'un ''GridView'' On voit la concaténation de deux colonnes et deux jointures. 
- 
-<code csharp> 
-protected void GridView1_Selecting(object sender, LinqDataSourceSelectEventArgs e) 
-{ 
-    CustomDataContext db = new CustomDataContext(); 
-    var requestList = from t1 in db.NomTable1 
-                      join t2 in db.NomTable2 on t1.IdNomTable2 equals t2.IdNomTable2 
-                      join t3 in db.NomTable3 on t1.IdNomTable3 equals t3.IdNomTable3 
-                      select new { 
-                            Id = t1.IdNomTable1, 
-                            t2.Field1, 
-                            t3.Field1, 
-                            Nom = t1.Prenom + " " + t1.Nom, 
-                            Description = t2.Description, 
-                      }; 
-    e.Result = requestList; 
-} 
-</code> 
- 
-Note : Il est préférable de mettre ''AutoGenerateColumns'' à ''false'' puisque la requête est //personnalisée//. 
- 
-=== Jointure avec méthode chainée === 
- 
-<code csharp> 
-var query = db.Companies.Where(c => c.CompanyName == companyName) 
-              .Join(db.Persons, c => c.CompanyId, p => p.CompanyId, (p, c) => p) 
-              .Select(p => new 
-              { 
-                  Id = p.PersonId, 
-                  Name = string.Format("{0} {1}", p.FirstName, p.LastName) 
-              }); 
-</code> 
- 
-[[http://stackoverflow.com/questions/4115452/method-chaining-equivalent|Source]] 
- 
- 
-=== Jointure avec clé composite === 
- 
-<code csharp> 
-var query = from o in db.Orders 
-    from p in db.Products 
-    join d in db.OrderDetails  
-        on new {o.OrderID, p.ProductID} equals new {d.OrderID, 
-        d.ProductID} into details 
-        from d in details 
-        select new {o.OrderID, p.ProductID, d.UnitPrice}; 
-</code> 
--> Exemple avec la base de données Northwind.  
- 
-=== Jointure avec DefaultIfEmpty === 
- 
-<code csharp> 
-join ea in EmployesAdresse on em.IdEmploye equals ea.IdEmploye into tempAdresse 
-from EmployeAdresse in tempAdresse.DefaultIfEmpty() 
-</code> 
- 
-=== Jointure sur plusieurs colonnes === 
- 
-<code csharp> 
-var query = from s in context.ShoppingMalls 
-            join h in context.Houses 
-            on 
-            new { s.CouncilCode, s.PostCode } 
-            equals 
-            new { h.CouncilCode, h.PostCode } 
-            select s; 
-</code> 
- 
-  * [[http://www.thereforesystems.com/linq-to-sql-join-on-multiple-conditions/|Source]] 
-==== Groupement ==== 
- 
-<code csharp> 
-var cities = from c in Customers 
- group c.ContactName by new {c.City, c.ContactTitle} into g 
- where g.Count() > 1 
- select g; 
-</code> 
- 
-<code csharp> 
-var count = from r in result  
-     group r by r.CODE into g 
-     orderby g.Count() descending 
-     select new { 
-         code = g.Key, 
- count = g.Count() 
-     }; 
-count.Dump(); 
-</code> 
- 
- 
----- 
-\\ 
-Pour regrouper dans une même colonne les données non-groupées par ''group by'', par exemple : 
- 
-{{:bd:sqlserver:linq_grouping.gif|}} 
- 
-On voit que la colonne ''IdUsers'' est une combinaison des ''Id'' utilisateurs du tableau de gauche. 
- 
-<code csharp> 
-var result =  
-  collection.GroupBy(x => new { x.IdPlace, x.IdInternship }) 
-    .Select(x => new { 
-                         x.Key.IdPlace, 
-                         x.Key.IdInternship, 
-                         IdUsers = String.Join(", ", x.Select(c => c.IdUser.ToString()).ToArray()) 
-                     }); 
-</code> 
- 
-==== Colonne null ==== 
- 
-S'il y a une colonne null dans la requête LINQ, par une jointure (**LEFT JOIN**) qui peut possiblement ne pas avoir d'enregistrement correspondant, on y verra le message suivant : 
-  La valeur null ne peut pas être assignée à un membre de type System.<T>, car il s'agit d'un type valeur non nullable. 
- 
-Il faut alors //caster// par un type nullable. 
- 
-<code csharp> 
-select new  
-{ 
-    Id = (int?) tRE.ID, 
-    Date = (DateTime?) tRE.DATE 
-}    
-</code> 
- 
-  
- 
- 
- 
-===== Insérer ===== 
-Dans certains exemples trouvés sur Internet et dans des livres de références, c'est la méthode ''Add()'' qui est utilisée pour ajouter un enregistrement.  Cette méthode a été remplacée par ''InsertOnSubmit()''. 
- 
-<code csharp> 
-Department dept = new Department(); 
-dept.Name = txtDepartmentName.Text; 
-dept.GroupName = txtGroupName.Text; 
-dept.ModifiedDate = DateTime.Now; 
-db.Department.InsertOnSubmit(dept); 
-db.SubmitChanges(); 
-MessageBox.Show("Department added"); 
-</code> 
- 
- 
- 
-===== Mise à jour ===== 
-<code csharp> 
-Employee emp = db.Employee.Single(r => r.Contact.LastName == txtLastName.Text); 
-emp.VacationHours = short.Parse(txtVacationHours.Text); 
-db.SubmitChanges(); 
-MessageBox.Show("Mise à jour réussie."); 
-</code> 
- 
-Pour régler les conflits potentiels : 
-<code csharp> 
-try { 
-    db.SubmitChanges(); 
-} 
-catch (ChangeConflictException) { 
-    db.ChangeConflicts.ResolveAll(RefreshMode.KeepChanges);  // Résoudre le conflit 
-} 
-</code> 
- 
-===== Supprimer ===== 
- 
-Tout comme l'insertion, la méthode de suppression ''Remove()'' a été remplacée par ''DeleteOnSubmit()''. 
- 
-<code csharp> 
-Department dept = db.Department.Single(d => d.Name == txtDepartmentName.Text); 
-db.Department.DeleteOnSubmit(dept); 
-db.SubmitChanges(); 
-MessageBox.Show("Department removed"); 
-</code> 
- 
- 
- 
- 
-===== Lier une procédure stockée à une opération CUD ===== 
-  - Créer une procédure stockée au besoin.  Exemple pour la mise à jour d'un département :<code tsql> 
-CREATE PROCEDURE dbo.uspUpdateDepartment 
-    @Name varchar(50), 
-    @GroupName varchar(50), 
-    @ModifiedDate datetime 
-AS 
-    UPDATE HumanResources.Department 
-    SET [Name] = @Name, 
-    [GroupName] = @GroupName, 
-    [ModifiedDate] = @ModifiedDate 
-RETURN 
-</code> 
-  - Glisser-déposer la procédure stockée sur la liste des méthodes du fichier DBML. 
-  - Aller dans les propriétés de l'entité à partir du designer DBML. 
-  - Associer la propriété //Delete//, //Insert// ou //Update// avec la méthode ajoutée précédemment. 
- 
-====== Opérateurs d'ensembles ====== 
-  * Union -> Retourne les éléments du premier ensemble ajouté au deuxième sans les doublons. 
-  * Distinct -> Enlève les doublons des ensembles. 
-  * Concat -> Retourne les éléments du premier ensemble ajouté au deuxième avec les doublons. 
-  * Intersect -> Retourne les éléments communs aux deux ensembles. 
-  * Except -> Enlève les éléments d'un ensemble qui se trouve dans un autre. 
- 
- 
-===== Union ===== 
-<code csharp> 
-var q = ( 
-        from c in db.Customers 
-        select c.Country 
-    ).Union( 
-        from e in db.Employees 
-        select e.Country 
-    ); 
-</code> 
- 
-===== Distinct ===== 
- 
- 
-===== Concat ===== 
- 
-<code csharp> 
-var q = ( 
-        from c in db.Customers 
-        select c.Phone 
-    ).Concat( 
-        from c in db.Customers 
-        select c.Fax 
-    ).Concat( 
-        from e in db.Employees 
-        select e.HomePhone 
-    ); 
-</code> 
- 
-===== Intersect ===== 
-<code csharp> 
-var q = ( 
-        from c in db.Customers 
-        select c.Country 
-    ).Intersect( 
-        from e in db.Employees 
-        select e.Country 
-    ); 
-</code> 
-===== Except ===== 
-<code csharp> 
-var q = ( 
-        from c in db.Customers 
-        select c.Country 
-    ).Except( 
-        from e in db.Employees 
-        select e.Country 
-    ); 
-</code> 
- 
-Source : [[http://srtsolutions.com/blogs/billwagner/archive/2006/10/06/linq-2-sql-set-operations.aspx|LINQ 2 SQL Set Operations]] 
- 
-====== Énumération des tables de référence ====== 
- 
- 
-^ EmployeeType ^^ 
-| Id | int  | 
-| Value | varchar(50)  | 
- 
-<code csharp> 
-public class EmployeeType 
-{ 
-    public static EmployeeType FullTime; 
-    public static EmployeeType PartTime; 
-    public static EmployeeType Occasional; 
- 
-    static EmployeeType() 
-    { 
-        var lookup = (from t in CustomDataContext.GetInstance().EmployeeType 
-                      select t).ToDictionary(i => t.Value); 
- 
-        FullTime = lookup["FullTime"]; 
-        PartTime = lookup["PartTime"]; 
-        Occasional = lookup["Occasional"]; 
-    } 
-} 
-</code> 
- 
-====== DataContext avec Singleton ====== 
- 
-<code csharp> 
-public partial class CustomDataContext : System.Data.Linq.DataContext 
-{ 
-    private static CustomDataContext _instance; 
- 
-    public static CustomDataContext GetInstance() 
-    { 
-        if (_instance != null) 
-        { 
-            return _instance; 
-        } 
-        else 
-        { 
-            _instance = new CustomDataContext(); 
-            return _instance; 
-        } 
-    } 
-} 
-</code> 
- 
- 
- 
-====== Debugging ====== 
- 
-Pour déboguer le code SQL généré par LINQ, il peut être utile d'installer **LINQ to SQL Debug Visualizer**((http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx)). 
- 
-  - Télécharger le fichier ''SqlServerQueryVisualizer.zip''((http://www.scottgu.com/blogposts/linqquery/SqlServerQueryVisualizer.zip)) 
-  - Dans le fichier ZIP, extraire le fichier ''SqlServerQueryVisualizer.dll'' qui se trouve dans ''SqlServerQueryVisualizer/bin/Debug''. 
-  - Copier ce fichier dans ''C:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\Visualizers\'' Fermer Visual Studio, avant de copier le fichier, si nécessaire. 
- 
-Dans Visual Studio il suffit de mettre un point d'arrêt après la requête LINQ et quand l'application est arrêtée, mettre le curseur sur la variable représentant la requête.   
- 
-{{:bd:sqlserver:linq_debug_001.png|}} 
- 
-En cliquant sur la loupe, on obtient la fenêtre **SQL Server Query Visualizer**.  On peut cliquer sur **Execute** pour voir le resultat. 
- 
-{{:bd:sqlserver:linq_debug_002.png|}} 
-===== Profilers ===== 
-  * [[http://l2sprof.com/home|The Linq to Sql Profiler]] 
-  * [[http://www.huagati.com/L2SProfiler/|Huagati Query Profiler - Runtime Profiling Tools for Linq to SQL and LLBLGen Pro]] 
-====== LINQ-to-SQL de base ====== 
- 
-Il est possible d'utiliser LINQ-to-SQL sans passer par la génération de code et le ORM designer.  Ceci peut être utile pour modifier le modèle de domaine déjà existant. 
- 
-Dans le code suivant, on spécifie le nom de la table (''Products'') qui diffère du nom de l'entité (''Product'').  Mais comme la table a été construite avec les mêmes noms de colonnes que les noms de propriétés, on a pas besoin de spécifier. 
- 
-<code csharp> 
-using System; 
-using System.Collections.Generic; 
-using System.Linq; 
-using System.Text; 
-using System.Data.Linq; 
-using System.Data.Linq.Mapping; 
- 
-namespace DomainModel.Entities 
-{ 
-    [Table(Name = "Products")] 
-    public class Product 
-    { 
-        [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] 
-        public int ProductID { get; set; }  
- 
-        [Column] public string Name { get; set; }  
-        [Column] public string Description { get; set; }  
-        [Column] public decimal Price { get; set; }  
-        [Column] public string Category { get; set; } 
-    } 
-} 
-</code> 
- 
-Et le //repository// (Design Pattern) qui doit accéder aux données : 
- 
-<code csharp> 
-using System; 
-using System.Collections.Generic; 
-using System.Linq; 
-using System.Text; 
-using System.Data.Linq; 
-using DomainModel.Entities; 
- 
-namespace DomainModel.Concrete 
-{ 
-    class SqlProductsRepository 
-    { 
-        private Table<Product> productsTable; 
-        public SqlProductsRepository(string connectionString) 
-        { 
-            productsTable = (new DataContext(connectionString)).GetTable<Product>(); 
-        } 
-        public IQueryable<Product> Products 
-        { 
-            get { return productsTable; } 
-        } 
-    } 
-} 
-</code> 
- 
-On peut utiliser dans un contrôleur : 
- 
-<code csharp> 
-using System; 
-using System.Collections.Generic; 
-using System.Linq; 
-using System.Web; 
-using System.Web.Mvc; 
-using DomainModel.Abstract; 
-using DomainModel.Concrete; 
- 
-namespace WebUI.Controllers 
-{ 
-    public class ProductsController : Controller 
-    { 
-        private IProductsRepository productsRepository; 
-        public ProductsController() 
-        { 
-            string connString = @"Server=SERVER;Database=SportsStore;Trusted_Connection=yes;"; 
-            productsRepository = new SqlProductsRepository(connString); 
-        } 
- 
-        public ViewResult List() 
-        { 
-            return View(productsRepository.Products.ToList()); 
-        } 
-    } 
-} 
-</code> 
- 
- 
-  * Source : //Pro ASP.NET MVC Framework//, Apress, p94. 
- 
-====== MetaModel ====== 
- 
- 
-<code csharp> 
-/// <summary> 
-/// Cette méthode remet les IDENTITY SEED à 0 pour les tables présentes dans le DataContext. 
-/// </summary> 
-public static void ReseedAllTables() 
-{ 
-    using (DataContext db = new DataContext()) 
-    { 
-        var model = db.Mapping; 
-        foreach (var mt in model.GetTables()) 
-        { 
-            db.ExecuteCommand("DBCC CHECKIDENT ({0}, RESEED, 0)", mt.TableName); 
-        } 
-    } 
-} 
-</code> 
- 
-<code csharp> 
-Northwind db = ...from somewhere 
-var model = db.Mapping; 
-foreach (var mt in model.GetTables()) 
-{ 
-    Console.WriteLine(mt.TableName); 
-} 
-</code> 
- 
- 
-Retrouver les noms de colonnes : 
- 
-<code csharp> 
-        var model = new AttributeMappingSource().GetModel(typeof(Northwind)); 
-        foreach (var mt in model.GetTables()) { 
-            Console.WriteLine(mt.TableName); 
-            foreach (var dm in mt.RowType.DataMembers)  
-                Console.WriteLine(" "+dm.MappedName); 
-</code> 
- 
-  * [[http://blogs.msdn.com/b/jomo_fisher/archive/2007/07/30/linq-to-sql-trick-get-all-table-names.aspx|Source]] 
- 
- 
-====== Insérer un fichier ====== 
- 
- 
-<code csharp> 
-string inputFilename = @"C:\temp\file.xlsm"; 
- 
-byte[] fileBytes = File.ReadAllBytes(inputFilename); 
- 
-Fichiers.InsertOnSubmit(new Fichier { 
-  Contenu = fileBytes, 
-  Nom = "Gabarit.xlsm", 
-  DateCreation = DateTime.Now, 
-  Taille = fileBytes.Count() 
-}); 
- 
-SubmitChanges(); 
-</code> 
- 
-====== Ressources ====== 
-  - [[http://www.linqpad.net/|LINQPad]] 
-  - [[http://code.google.com/p/dblinq2007/|LINQ provider for Oracle, PostgreSQL, MySQL, Ingres, SQLite, Firebird and ... SQL Server (C# 3.0)]] 
-  - [[http://stackoverflow.com/questions/118497/linq-type-tables-best-practices|LINQ + type tables best practices]] - [[http://msdn.microsoft.com/en-us/library/bb386947.aspx#EnumMapping|EnumMapping]] 
-  - [[http://www.asp.net/learn/linq-videos/|"How Do I?" with LINQ]] 
-  - [[http://www.hookedonlinq.com/LINQtoSQL5MinuteOverview.ashx|LINQ to SQL - 5 Minute Overview]] 
-  - [[http://www.codeproject.com/KB/linq/linq-to-sql-detach.aspx?display=Print|LINQ to SQL - Detach Entities]] 
-  - LINQ to XML 
-    - [[http://weblogs.asp.net/scottgu/archive/2007/09/20/the-new-c-null-coalescing-operator-and-using-it-with-linq.aspx|The C# ?? null coalescing operator (and using it with LINQ to XML)]] 
-  - [[http://www.devart.com/linqconnect/|LinqConnect]] 
-  - [[http://www.codeproject.com/KB/linq/linqtutorial.aspx|A LINQ Tutorial: Mapping Tables to Objects]] (avec WCF) 
-===== Code generation ===== 
-  
-  * [[http://www.plinqo.com/|PLINQO]] (A set of CodeSmith templates for LINQ to SQL) 
-  * [[http://t4toolbox.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=34574|T4 Toolbox]] ([[http://www.olegsych.com/2009/05/t4-toolbox-linq-to-sql-schema-generator/|T4 Toolbox: LINQ to SQL schema generator]]) 
- 
-====== Sources ====== 
-  - P. MEHTA, Vijay, //Pro LINQ Object Relational Mapping with C%%#%% 2008//, Apress, 2008. 
-  - C. RATTZ, Joseph, //Pro LINQ - Language Integrated Query in C-Sharp 2008//, Apress, 2007. 
-  - [[http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx|Using LINQ to SQL]] 
-  - [[http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/360166df-4e50-44d8-812a-04b5bc4fedd1/|SQL SubQuery using LINQ]] 
-  - [[http://dotnetslackers.com/articles/csharp/IntroducingLINQ1.aspx|Introducing LINQ]] 
-  - [[http://blog.jemm.net/articles/databases/how-to-common-data-patterns-with-linq-to-sql/|How-To: Common Data Patterns with LINQ to SQL]] 
-  - [[http://www.hookedonlinq.com/LINQtoSQL5MinuteOverview.ashx|LINQ to SQL - 5 Minute Overview]] 
-  - [[http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx|101 LINQ Samples]] 
developpement/dotnet/linq/linq-to-sql/introduction.1438386138.txt.gz · Dernière modification : 2022/02/02 00:43 (modification externe)