2 Stimmen

Wie kann man über die Ergebnisse einer Linq-to-SQL-Abfrage iterieren und die Ergebnisse anhängen?

Ich bin neu in C# und Linq-to-Sql.

Ich habe eine Tabelle 'InstrumentTypes' in dieser Form:

typeId(int)  | type(varchar)  |  subttype(varchar)

101               Keys           keyboard
102               Keys           accessories
103               Guitar         acoustic
104               Guitar         electric

Ich muss alle 'typeId's aus der Tabelle basierend auf einer Eingabe von 'type' abrufen und alle benötigten typeId's an einen ASP Repeater binden.

Bisher habe ich den folgenden Code geschrieben:

// requestType enthält den Typ aus der Suche
var type = (from m in database.InstrumentTypes
            where m.type == requestType
            select m);
foreach(var typeId in type)
{
    //code
}

Ich kann nicht herausfinden, wie ich über die Ergebnisse der Abfrage iterieren, sie in einer Datenstruktur speichern und an einen Repeater binden kann.

Der folgende Code bindet es an den Repeater:

Repeater1.DataSource= //Name der verwendeten Datenstruktur zur Speicherung der Typen hier einfügen
Repeater1.DataBind();

Kann mir bitte jemand helfen?

EDIT: Für jede erhaltene typeID möchte ich auf eine weitere Tabelle 'Instruments' zugreifen und alle Instrumente abrufen, die zu dieser Typ-ID gehören. Die Tabelle 'Instruments' ist wie folgt:

instrumentId     typeID    name     description
1000             101       yamaha   xyz

Basierend auf der Antwort von Arialdo mache ich folgendes:

var type = (from m in database.InstrumentTypes
                          where m.type == requestType
                          select m);
            var instruments = new List();
            foreach (var i in type)
            {
                instruments.Add(from x in database.Instruments
                                where x.typeId == i.typeId
                                select x);
            }
            Repeater1.DataSource = instruments;
            Repeater1.DataBind();

Aber ich erhalte einen Kompilierungsfehler, der besagt 'The best overloaded method match for the List has some invalid arguments'. Wo mache ich einen Fehler?

7voto

Arialdo Martini Punkte 4307

Was du bekommst von

var typ = (from m in database.InstrumentTypes
        where m.type == requestType
        select m);

ist eine Sammlung von InstrumentTypes, nicht eine Sammlung von IDs.

Dies funktioniert für mich

var typen = (from m in database.InstrumentTypes
        where m.type == requestType
        select m);
var ids = new List();
foreach (var typ in typen)
{
    ids.Add(typ.Id);
}

was du leicht umwandeln könntest in

var ids = (from m in database.InstrumentTypes
        where m.type == requestType
        select m.Id).ToList();

[Bearbeiten]

Du kannst direkt deine Instrumente abfragen und zu verwandten Objekten navigieren, solange du eine Beziehung zwischen InstrumentType und Instrument definiert hast.

var instrumente = (from i in database.Instrument
                      where i.InstrumentType.type == requestType
                      select i);

Es ist nicht notwendig separate foreach-Schleifen oder Abfragen zu haben. Der i.InstrumentType wird zu einem join konvertiert, wie du mit einem SQL Profiler verifizieren könntest

3voto

bkingdev Punkte 237

Ich bin mir nicht sicher, was du fragst.

Ohne den zurückgegebenen Typ deiner Abfrage explizit zu definieren, gibst du bereits ein IEnumerable-Objekt zurück. Wenn du eine Liste von IDs möchtest, kannst du deine Abfrage einfach verfeinern, um IDs anstelle von einer Liste von InstrumentTypes zurückzugeben. Natürlich würdest du dann ein IEnumerable-Objekt zurückgeben.

var type = (from m in database.InstrumentTypes
        where m.type == requestType
        select m.typeId);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X