2017-05-03 5 views
1

Ich habe zwei verbundenen Unternehmen mit zusammengesetzten Schlüsseln:Wie beitreten zwei LINQ-Abfragen

public class Event 
{ 
    public string ID1 { get; set; } 
    public int ID2 { get; set; } 
    public DateTime EventDate { get; set; } 
    public string EventData { get; set; } 
    public string DocID1 { get; set; } 
    public int DocID2 { get; set; } 
} 

public class EventDocument 
{ 

    public string ID1 { get; set; } 
    public int ID2 { get; set; } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Number { get; set; } 

    public virtual ICollection<Event> Events { get; set; } 
} 

Gibt es eine Möglichkeit, durch einige Kriterien zu filtern erste von ihnen beiden und Ergebnisse zu kommen, weil große Menge von Datensätzen?

Tatsächlich kann ich verwandte Ereignisse erreichen, wenn ich EventDocuments filter, aber ich brauche auch eine Möglichkeit, Event und EventDocument auf einmal zu filtern.

ich so zu tun, ich versuche:

var events = ModelContext.Events.AsNoTracking().Select(x => x); 
events = events.Where(x => x.EventData.StartsWith(FilterCriteria)); 


var eventDocuments = ModelContext.EventDocuments.AsNoTracking().Select(x => x); 
eventsDocuments = eventDocuments.Where(x => x.LastName.StartsWith(FilterLastName)); 

Und jetzt brauche ich diese Anfragen zu verbinden und ein Ergebnis bekommen - gefiltert und verbundenen Daten aus zwei Entitäten

Der Versuch, wie dies zu tun:

var result = eventDocuments.Join(events, 
         doc => new { doc.ID1, doc.ID2 }, 
         ev => new { cross.DocID1, cross.DocID2}, 
         (doc, ev) => new { EventDocument = doc, Event = ev }); 
+0

Ja, um die Ereignisse zu eventDocuments beizutreten. Was ist das Problem? –

+0

Haben Sie einen Fehler und don t understant es: Schwere \t-Code \t Beschreibung \t Fehler \t CS0411 \t Die Typargumente für die Methode ‚Enumerable.Join (IEnumerable , IEnumerable , Func , Func , Func ) kann nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben. – Songaila

+0

* Warum * fragen Sie nach Beitritt? Wenn du ein eventDocument lädst, lädt EF auch seine Events, vorausgesetzt du sagst es zu 'Include()' –

Antwort

1

Sie können beide Sätze einfach mit abfragen. In der Abfragesyntax würde dies wie folgt aussehen:

Sie müssen keine Abfrage verwenden, um Ihre Ergebnisse zu filtern. Sie können mehrere Abfragen kombinieren:

var eventsQry = 
    from ev in events 
    where ev.EventData.StartsWith(FilterCriteria) 
    select ev 

var documentsQry = 
    from eventDocument in documentsQry 
    where eventDocument.LastName.StartsWith(FilterLastName) 
    select eventDocument; 

var combinedQry = 
    from eventDocument in documentsQry 
    from ev in eventsQry 
    where (ev.ID1 == eventDocument.ID1) && (ev.ID2 == eventDocument.ID2) 
    select new { eventDocument, ev }; 
+0

Aber ich muss nach vielen und verschiedenen Kriterien jedes Mal zu filtern, und Tabellen haben viele Spalten, Jus einige beschrieben ... Also dachte ich, ich kann zuerst fiter und dann beitreten? – Songaila

+0

Sie können separate Abfragen definieren und sie dann verbinden. – Sefe

+0

Und könnten Sie mir helfen, mit Lambda zu schreiben? – Songaila