2016-12-27 5 views
0

Ich bin neu bei Linq und ich versuche, eine Abfrage mit der Northwind-Datenbank, die alle Lieferanten, die zwei oder mehr Produkte in der gleichen Kategorie enthalten haben, zu schreiben.Northwind Datenbank Linq Abfrage

var test1 = 
(from p in Products 
join pi in Products on p.CategoryID equals pi.CategoryID 
join pf in Products on p.SupplierID equals pf.SupplierID 
where p.ProductID != pi.ProductID 
select new 
{p.ProductName, p.CategoryID, p.SupplierID}).ToList().Distinct(); 


test1.Dump(); 

Dies war mein letzter Versuch, der nicht funktioniert hat. Ich bin ein wenig resigniert, weil ich seit Stunden versuche, das herauszufinden, und es wird immer noch nicht tun, was es soll. Vielleicht verstehe ich es einfach komplett falsch?

Mein Ansatz war, dass es zwei oder mehr Einträge mit der gleichen SupplierID und CategoryID aber unterschiedlicher ProductID geben muss, aber ich habe noch keine Lösung gefunden.

+0

Können Sie uns sagen, was los ist? Was erwartest du und was bekommst du? – Sefe

Antwort

0

Dies wird besser ein GroupBy() verwendet:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 
using System.Data.SqlClient; 


namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<Product> Products = new List<Product>() { 
       new Product() { ProductName = "ABC", CategoryID = 1, SupplierID = 1}, 
       new Product() { ProductName = "DEF", CategoryID = 1, SupplierID = 1}, 
       new Product() { ProductName = "GHI", CategoryID = 1, SupplierID = 3}, 
       new Product() { ProductName = "JKL", CategoryID = 1, SupplierID = 3}, 
       new Product() { ProductName = "MNO", CategoryID = 2, SupplierID = 1}, 
       new Product() { ProductName = "PQR", CategoryID = 3, SupplierID = 1}, 
       new Product() { ProductName = "STU", CategoryID = 4, SupplierID = 1}, 
       new Product() { ProductName = "VWX", CategoryID = 4, SupplierID = 1}, 
       new Product() { ProductName = "YZ1", CategoryID = 4, SupplierID = 1}, 
       new Product() { ProductName = "234", CategoryID = 5, SupplierID = 1} 
      }; 



      var test1 = Products.GroupBy(x => new { supplier = x.SupplierID, category = x.CategoryID }) 
       .Where(x => x.Count() >= 2).Select(y => y.Select(z => new { name = z.ProductName, supplier = y.Key.supplier, category = y.Key.category })).SelectMany(x => x).ToList(); 

      foreach (var item in test1) 
      { 
       Console.WriteLine("Name = '{0}', Supplier = '{1}', Category = '{2}'", item.name, item.supplier, item.category); 
      } 
      Console.ReadLine(); 
     } 

    } 
    public class Product 
    { 
     public string ProductName { get; set; } 
     public int CategoryID { get; set; } 
     public int SupplierID { get; set; } 
    } 
} 
0

Ihr gewünschtes Ergebnis fehlt, aber ich kann Ihnen sagen, dass gerade jetzt tun wird, ist nicht viel Gutes, was du tust.

Einfach ausgedrückt, Sie bitten derzeit die Datenbank, alle Produkte zurückzugeben, die mit allen Produkten übereinstimmen, die mit allen Produkten übereinstimmen, was grundsätzlich dazu führt, dass Sie alle Produkte erhalten, wenn die Datenbank keine Zeitüberschreitung hat. So können wir Ihre Anfrage zu diesem vereinfachen:

var test1 = 
(from p in Products 
select new 
{p.ProductName, p.CategoryID, p.SupplierID}).ToList().Distinct(); 

Aus dieser Auswahl können Sie dann eine einzigartige Listen von Produktnamen, Kategorie und Lieferanten auswählen möchten. Die Hauptfrage hier ist: Möchten Sie eine eindeutige Liste von Kombinationen, oder muss eine der drei Eigenschaften eindeutig sein? Angenommen, der erste, der einfachste Weg, um Ihr Ergebnis zu erhalten, ist als solche:

public class ProductResult : IEquatable<ProductResult> // we have to tell C# compiler how to check if the objects are different from one another 
{ 
    public string Name { get; set; } 
    public string Category { get; set; } 
    public string Supplier { get; set; } 

    public bool Equals(ProductResultother) 
      { 
       if (other == null) 
        return false; 

       return (Category == other.Category) 
         && Supplier == other.Supplier) 
         && Name == other.Name); // optionally do an .Equals() to make this case-insensitive (check for nulls first if you do this!) 
      } 
} 

Dann können Sie dies tun:

var test1 = (from p in Products 
select new ProductResult() 
{ 
    Name = p.ProductName, 
    Category = p.CategoryId, 
    Supplier = p.SupplierID, 
}).Distinct(); 

Sie haben nun eine Liste aller einzigartige Produktname/Kategorie/Lieferanten-Kombinationen .