2017-10-06 5 views
0

Ich möchte mehrere Dokumente in MongoDB verbinden. Ich habe folgenden Code verwendet, aber es funktioniert nicht. Habe ich irgendwas falsch gedacht? Ich habe das Basiseinheitsmodell hinzugefügt, das die ID enthält.Wie man mehrere Dokumente verbindet?

var products = _productRepository.GetCollection(_dbContext); 
var prodWarhoseMapping = _productWarehouseMapRepository.GetCollection(_dbContext); 
var warhouses = _warehouseRepository.GetCollection(_dbContext); 

public class Product:BaseEntity 
{ 
    public string product_code { get; set; } 
    public decimal fat_tax { get; set; } 
} 

public class ProductWarehouseMap :BaseEntity 
{ 
    public ObjectId product_id { get; set; } 
    public ObjectId warehouse_id { get; set; } 
    public int qty { get; set; } 
    public decimal price { get; set; } 
} 
public class Warehouse :BaseEntity 
{ 
    public ObjectId supplier_id { get; set; } 
    public string warehouse_code { get; set; } 
    public string name { get; set; } 
    public string email { get; set; } 
    public string phone { get; set; } 
    public string street_address { get; set; } 
    public string city { get; set; } 
    public string postal_code { get; set; } 
    public string region { get; set; } 
    public string country { get; set; } 
    public string manager_name { get; set; } 
    public string fax { get; set; } 
} 

//works proper 
var query1 = (from p in products 
      join pm in prodWarhoseMapping on p._id equals pm.product_id 
         select new 
         { 
          Products = p, 
          ProductMapping = pm, 
         }).ToList(); 

//Getting error 
var query = (from p in products 
    join pm in prodWarhoseMapping on p._id equals pm.product_id 
    join wh in warhouses on pm.warehouse_id equals wh._id 
    select new 
    { 
     Products = p, 
     ProductMapping = pm, 
     Warehouse = wh 
    }).ToList(); 

Bellow ist die Basisentität Ich habe vergessen Basisentität Modell

public class BaseEntity 
{ 
    [BsonIgnoreIfDefault] 
    public ObjectId _id { get; set; } 

} 

Bellow ist Fehler

Expression des Typs ‚Nachricht hinzufügen System.Collections.Generic.IEnumerable 1[Project.Communication.EntityModels.ProductWarehouseMap]' cannot be used for parameter of type 'System.Linq.IQueryable 1 [Project.Communication.EntityModels.ProductWarehouseMap] 'der Methode' System.Linq.IQueryable 1[Project.Communication.EntityModels.ProductWarehouseMap] Where[ProductWarehouseMap](System.Linq.IQueryable 1 [Projec t.Communication.EntityModels.ProductWarehouseMap], System.Linq.Expressions.Expression 1[System.Func 2 [Project.Communication.EntityModels.ProductWarehouseMap, System.Boolean]])‘ Parametername: arg0

+0

Wir brauchen mehr als * Erste Fehler *, Ihnen zu helfen, zum Beispiel die Fehlermeldung/den Code. Auch die '_id'-Eigenschaft ist in Ihren Klassendefinitionen nicht zu sehen. –

+0

@KeyurPATEL Plz check obigen Code Ich habe Base-Entity-Modell hinzugefügt, das ID enthält. –

+0

Noch einmal, die Fehlermeldung/Code wäre hilfreich, die '_id' Definition sieht gut aus. –

Antwort

1

Ihre Fehlermeldung es Where erscheinen lässt wird verwendet, aber es ist nicht (vorausgesetzt, der Code, den Sie zeigen, ist genau das, was Sie versucht haben zu kompilieren). Trotzdem können Sie einige Varianten versuchen wie

Wählen ausüben() im Speicher IEnumerable mit:

var query = (from p in products 
    join pm in prodWarhoseMapping on p._id equals pm.product_id 
    join wh in warhouses on pm.warehouse_id equals wh._id) 
    .AsEnumerable() 
    .Select(s => new 
    { 
     Products = p, 
     ProductMapping = pm, 
     Warehouse = wh 
    }).ToList(); 

Oder mit AsQueryable()

var query = (from p in products.AsQueryable() 
    join pm in prodWarhoseMapping.AsQueryable() on p._id equals pm.product_id 
    join wh in warhouses.AsQueryable() on pm.warehouse_id equals wh._id 
    select new 
    { 
     Products = p, 
     ProductMapping = pm, 
     Warehouse = wh 
    }).ToList(); 

EDIT: die oben genannten Ansätze werden sehr lange dauern und die Nutzung eine Menge Speicher, wenn die Datensätze riesig sind.

Um die zugrunde liegende Ursache zu finden, die Sie diese Abfrage könnte versuchen, und lassen Sie mich wissen, was es gibt:

var query2 = (from pm in prodWarhoseMapping 
     join wh in warhouses on pm.warehouse_id equals wh._id 
        select new 
        { 
         ProductMapping = pm, 
         Warehouse = wh,        
        }).ToList(); 
+0

Ihre Antwort ist richtig, aber, Produkt und ProdWarhoseMapping-Tabelle möglicherweise Daten in fehlt, und ich muss mehr Join auch hinzufügen. Dann wird es richtig funktionieren oder irgendein Speicherproblem wird kommen? –

+0

Wenn Sie lakhs meinen, kann es ein Problem sein, diesen Ansatz zu verwenden. Wir müssen die zugrunde liegende Ursache finden und beheben. Versuchen Sie den Code, den ich hinzugefügt habe, indem Sie ihn bearbeiten und lassen Sie mich wissen, wenn es funktioniert, wird es beim Debuggen helfen. –

Verwandte Themen