2009-04-26 2 views
4

Я хочу, чтобы соответствовать 2 идентичным таблицам:Как сопоставить две идентичные таблицы базы данных с LINQ?

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

, но количество строк и содержимым записи могут отличаться. Как выбрать определенную запись = raw из одной таблицы и получить ее клонов из другой таблицы (например, проверить, существует ли такая же запись)? Как это сделать с помощью LinQ?

UPDATE: Вот код 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

Я обновил свой пост, чтобы включить код, который вам вставлены под другим вопросом. –

+0

Мне интересно, почему вы требуете, чтобы пользователь снова вводил все данные, когда у вас уже есть это. – Neal

ответ

0

Вы, вероятно, может сделать это с помощью объединения, но я хромал вместе модульное тестирование, которое показывает один из способов этого

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

Я бы присоединиться на ManId, а затем сравнить остальные значения в предложении, где:

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"; 
} 

Я использовал Any() для создания эффективного запроса SQL EXISTS. Вы можете использовать SingleOrDefault() или FirstOrDefault() вместо этого, если вам действительно нужно использовать возвращенный продукт.

Я также не вижу где-нибудь, что вы используете идентификатор вашего нового продукта - вам может понадобиться, чтобы добавить этот фильтр в запросе, а также:

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 
    ... 
Смежные вопросы