Frage

Ich habe eine Linq-Abfrage, die die ID einer Frage auf die Fragen textbasierten zurückgibt. Diese ID wird dann verwendet werden benötigt ein Datum in einem Datum Tabelle auf die jeweilige Frage zu beziehen. Die Frage ist bereits gespeichert und das Datum wird zu einem anderen Zeitpunkt gespeichert.

Das Problem ist, dass die Abfrage die QuestionID als anonymer Typ zurückgibt und so, wenn ich brauche zuweisen, dass QuestionID als QuestionID in einer anderen Tabelle, ein Fehler wirft, die besagt, dass die Tabelle eine Guid erwartet. Im Anschluss daran umgewandelt ich den anonymen Typen in einen String und verwenden dann die GUIDs Funktion konvertiert den String in eine GUID zu konvertieren, aber es wird mir jetzt den Fehler zu geben, dass eine GUID 32 Zeichen lang sein sollte und 4 Striche.

Meine Gedanken in Bezug auf diese sind, dass die anonyme Art der QuestionID als „QuestionID = jkj939-89239829- etc etc.“ kehrt zurück -. Mit dem Präfix von Zeichen an der Front, und somit, wenn es um eine GUID, die konvertierte Zeichenfolge enthält diese Zeichen Umwandlung

Habe ich etwas verpasst? Ich kann wirklich nicht verstehen, warum es dies tun würde, und ist es eine Möglichkeit, das Präfix von dem anonymen Typ zurückgegeben zu entfernen? Hilfe würde sehr geschätzt werden.

Hier ist der Code:

public static void GetQuesID(string quesText)
    {
        ExamineDataContext dc = new ExamineDataContext();
        var matchedques = from q in dc.GetTable<Question>()
                            where q.QuestionText.Contains(quesText)
                            select new{
                                q.QuestionID
                            };
        foreach (var element in matchedques)
        {
            MessageBox.Show(element.ToString());
        }

        try
        {
            Guid g = Guid.NewGuid();
            Table<DateLastUsed> dlused = Repository.GetDateLastUsedTable();
            DateLastUsed dlu = new DateLastUsed(); ;
            string qidGuidString = matchedques.ToString();
            Guid convQuesGuid = new Guid(qidGuidString);
            dlu.DLUID = g;
            dlu.QuestionID = convQuesGuid;
            dlu.DateLastUsed1 = DateTime.Now;

            dlused.InsertOnSubmit(dlu);
            dlused.Context.SubmitChanges();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
War es hilfreich?

Lösung

Es sei denn, ich etwas fehle, warum Sie nicht nur select q.QuestionID anstatt einen neuen anonyme-Typ-Wrapper zu machen?

var matchedques = from q in dc.GetTable<Question>()
                            where q.QuestionText.Contains(quesText)
                            select q.QuestionID;

foreach (var element in matchedques)
{
    MessageBox.Show(element.ToString());
}

Alternativ gibt dem Feld einen Namen ( „theID“ weiter unten) und greifen Sie direkt an:

var matchedques = from q in dc.GetTable<Question>()
                            where q.QuestionText.Contains(quesText)
                            select new{
                                theID = q.QuestionID
                            };

foreach (var element in matchedques)
{
    MessageBox.Show(element.theID.ToString());
}

Offenbar war es mehr auf die Frage, als ich zuerst dachte. Als Reaktion auf den Kommentar, bedenken Sie, dass Sie der Rückkehr eine Aufzählung der Ergebnisse in matchedques (daher der foreach oben, nicht wahr?). So ist die folgende Zeile ist auch in Fehler:

string qidGuidString = matchedques.ToString();

Sie wollen entweder

string qidGuidString = matchedques.Single().ToString();

Wenn matchedques ein einzelnes Ergebnis enthalten sollte, oder eine foreach-Schleife, wenn matchedques mehr Ergebnisse enthalten sollte.


Beachten Sie, dass es kein Grund ist eine GUID in String und wieder zurück zu konvertieren, und Sie können auch die Abfrage verwenden, um etwas nützlichen (nämlich ein neues DateLastUsed Objekt) zurück:

var matchedques = from q in dc.GetTable<Question>()
                            where q.QuestionText.Contains(quesText)
                            select new DateLastUsed() {
                                DLUID = Guid.NewGuid(),
                                QuestionID = q.QuestionID,
                                DateLastUsed1 = DateTime.Now
                            };

Table<DateLastUsed> dlused = Repository.GetDateLastUsedTable();

foreach(var dlu in matchedques)
{
    dlused.InsertOnSubmit(dlu);
    dlused.Context.SubmitChanges();
}

Andere Tipps

Warum gerade nicht statt dieses select q.QuestionID; `wählen neue {q.QuestionID};‘ Zeug?

Sie rufen .ToString () auf matchedques, die eine Aufzählung ist:

var matchedques = from q in dc.GetTable<Question>()
                            where q.QuestionText.Contains(quesText)
                            select new{
                                q.QuestionID
                            };

string qidGuidString = matchedques.ToString();

Also in Ihrem obigen Beispiel matchedques ist ein enunmeration von anonymen Typen (Sie sollten wahrscheinlich damit tun weg und wählen Sie q.QuestionID direkt). Der Aufruf ToString () auf diese wird eine String-Darstellung des Objekts zurückzukehren, und nicht einfach die QuestionID des ersten Elements der Folge.

Erwarten Sie dort immer nur ein Ergebnis für die obige Abfrage sein? Wenn ja, sollten Sie wahrscheinlich am Einzel Betreiber suchen.

So etwas sollte tun:

var matchedQuesId = 
    dc.GetTable<Question>()
    .Where(q =>q.QuestionText.Contains(quesText))
    .Single()
    .QuestionID;

In diesem Fall können Sie dann direkt verwenden matchedQuesId. Beachten Sie, dass, wenn die Abfrage Wo keine übereinstimmt, oder mehr als ein Element, das einen Fehler werfen. Informieren Sie sich auf dem Single Operator, um herauszufinden, warum.

Versuchen Sie folgendes:

var matchedques = (from q in dc.GetTable<Question>()
                  where q.QuestionText.Contains(quesText)
                  select new{
                      q.QuestionID
                  }).FirstOrDefault();

Dann einfach:

if (matchedques != null){
    // Just use matchedques.QuestionID to get your value
}

FirstOrDefault die matchedques var auf eine einzige Instanz des Objekts, kein ennumeration von ihnen eingestellt. Arbeitet ein Genuss, wenn Sie wissen, dass es nur einen Wert, den Sie wollen. Die OrDefault Bit bedeutet, wird es NULL, wenn nichts gefunden.

Wechsel zu:

...
var matchedques = from q in dc.GetTable<Question>()
                        where q.QuestionText.Contains(quesText)
                        select q.QuestionID;

z. entfernen neue {...}, so dass Sie einen neuen anonimouse Typen mit der ID-Eigenschaft zu schaffen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top