2009-04-26 6 views
4

Je veux correspondre 2 tables identiques:Comment faire correspondre deux tables de base de données identiques avec LINQ?

sourceProducts (productName, ProductionDate, ManID, shipper, distributer) 
CommProducts (productName, ProductionDate, ManID, shipper, distributer) 

mais le nombre de lignes et le contenu de l'enregistrement peuvent différer. Comment puis-je sélectionner un certain enregistrement = brut d'une table et obtenir son enregistrement clone à partir de l'autre table (par exemple, vérifier si le même enregistrement existe)? Comment est-ce que je fais cela en utilisant LinQ?

MISE À JOUR: Voici le code LINQ:

protected void checkBtn_Click(object sender, EventArgs e) 
    { 

     MyProductsDataContext mySdb = new MyProductsDataContext(); 

     Product mypro = new Product { ManId = int.Parse(TxtManI.Text), ProductName = TxtProN.Text, ProductionDate =DateTime .Parse (TxtProDat.Text), Shipper = TxtShipI.Text, Distributer = TxtDistI.Text }; 

     var spro = (from p in mySdb.Products 
         select new { p.ManId, p.ProductName, p.ProductionDate, p.Shipper, p.Distributer }). 
         Intersect(from s in mySdb.SourceProducts select new { s.ManId, s.ProductName, s.ProductionDate, s.Shipper, s.Distributer }); 

     if (spro != null) 
     { 
      LblMessage.Text = "Acceptable product Data Inserted Sucessfully"; 
      InsertData(); 
     } 
     else 
     { 
      LblMessage.Text = "Invalid Product or bad Entry Please retype"; 
     } 
    } 
+0

Je mis à jour votre message pour inclure le code que vous collé sous l'autre question. –

+0

Je me demande pourquoi vous demandez à un utilisateur d'entrer à nouveau toutes les données quand vous l'avez déjà disponible. – Neal

Répondre

0

Vous pouvez probablement le faire en utilisant une jointure, mais je l'ai clopinant ensemble un test unitaire qui montre d'une manière à ce

public class TestProduct 
{ 
    public int ManId { get; set; } 
    public string ProductName { get; set; } 
    public DateTime ProductionDate { get; set; } 
    public string Shipper { get; set; } 
    public string Distributor { get; set; } 
} 

[TestMethod] 
public void TestSourceTable() 
{ 
    // Set up a test list 
    var list = new List<TestProduct>(); 
    for (int i=0;i<5;i++) 
    { 
     var p = new TestProduct 
      { 
       Distributor = "D" + i, 
       ManId = i, 
       ProductionDate = DateTime.Now, 
       ProductName = "P" + i, 
       Shipper = "S" + i 
      }; 
     list.Add(p); 
    } 

    // Get an existing product 
    var existingProduct = list[4]; 

    // Get an unknown product 
    var unknownProduct = new TestProduct() 
     { 
      ManId = -1, 
      Distributor = "", 
      ProductionDate = DateTime.Now.AddDays(-1), 
      ProductName = "", 
      Shipper = "" 
     }; 

    // product found 
    Assert.True(list.Any(p => p == existingProduct)); 

    // product not found 
    Assert.False(list.Any(p => p == unknownProduct)); 
} 
1

Je voudrais rejoindre sur ManId puis comparer le reste des valeurs dans une clause where:

bool productExists = (
    from p in mySdb.Products 
    join s in mySdb.SourceProducts 
     on p.ManId equals s.ManId 
    where p.ProductName == s.ProductName 
     && p.ProductionDate == s.ProductionDate 
     && p.Shipper == s.Shipper 
     && p.Distributer = s.Distributer 
    select new { p.ManId, p.ProductName, p.ProductionDate, p.Shipper, p.Distributer } 
    ).Any(); 

if (productExists) 
{ 
    LblMessage.Text = "Acceptable product Data Inserted Sucessfully"; 
    InsertData(); 
} 
else 
{ 
    LblMessage.Text = "Invalid Product or bad Entry Please retype"; 
} 

J'ai utilisé Any() pour produire une requête SQL efficace EXISTS. Vous pouvez utiliser SingleOrDefault() ou FirstOrDefault() à la place si vous avez réellement besoin d'utiliser le produit retourné.

Je ne vois pas aussi partout que vous utilisez votre nouveau ID de produit - vous pourriez avoir besoin d'ajouter que le filtre à la requête ainsi:

Product mypro = new Product { ... }; 

bool productExists = (
    from p in mySdb.Products 
    where p.ManId equals mypro.ManId 
    join s in mySdb.SourceProducts 
     on p.ManId equals s.ManId 
    ... 
Questions connexes