none
LINQ-Ausdruck hat einen Fehler RRS feed

  • Frage

  • Hallo,
    wie muss der folgende LINQ-Ausdruck geändert werden, damit dieser funktioniert.
    Fehler: Cannot convert expression 'MobileDevice' to return type 'bool'
     
    var mobileDevice = _users.Any(u => u.MobileDevices.FirstOrDefault(d => d.Name == device.DeviceName));

    Ich will, dass jeder User in der Liste _users nach seinen Mobilgeräten durchsucht wird.
    Wird ein Mobilgerät gefunden, dessen Name mit device.DeviceName übereinstimmt, dann soll dieses an var mobileDevice übergeben werden.

    Viele Grüße
    Alexander
    Freitag, 22. Juni 2018 08:02

Antworten

  • Hallo Alexander,

    ich fragte nur, weil dein Code nun so gar nicht zu deiner Anforderung gepasst hat.

    Jetzt ist es klar und Du kannst das Gewünschte bspw. so erreichen:

    String deviceName = "Device B 1";
    
    List<User> users = new List<User>();
    users.Add( new User() {
                            Name = "User A",
                            MobileDevices = new List<MobileDevice>() {
                                                                       new MobileDevice() { Name = "Device A 1" },
                                                                       new MobileDevice() { Name = "Device A 2" }
                                                                     }
                          } );
    users.Add( new User() {
                            Name = "User B",
                            MobileDevices = new List<MobileDevice>() {
                                                                       new MobileDevice() { Name = "Device B 1" },
                                                                       new MobileDevice() { Name = "Device B 2" }
                                                                     }
                           } );
    
    var mobileDevice = ( from u in users
                             from d in u.MobileDevices
                             where d.Name == deviceName
                             group d by d.Name
                             into r
                             select r.FirstOrDefault()
                       ).FirstOrDefault();
    

    Es gibt auch andere Wege und ggfs. hat sich hier noch ein Fehler eingeschlichen, es sollte dir aber zeigen, wie es generell geht und die ausreichend Denkanstöße liefern.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert AlexanderRi Freitag, 22. Juni 2018 11:35
    Freitag, 22. Juni 2018 10:56
    Moderator

Alle Antworten

  • Hallo Alexander,

    Any erwartet wie die meisten anderen Funktionen dieser Art kein Objekt vom Typ "Irgendwas" sondern eine Funktion mit einer oder mehreren Bedingung(en), die true/false zurückgeben.

    Frage ist aber auch, was soll eigentlich ermittelt werden?

    Dein Code sagt eigentlich, dass Du eine Liste von Users, nicht von MobileDevices ermittelst. Daher die Frage: Was genau willst Du machen? Kann ein MobileDevice nur ein einziges mal vorkommen? Oder auch bei mehreren Usern? Willst Du dann die User haben oder nur die MobileDevices? Falls letzteres, brauchst Du einen Bezug zum User?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 22. Juni 2018 09:47
    Moderator
  • Hallo Stefan,
    das gewünschte Ergebnis habe ich bereits oben genannt.

    Ich will, dass jeder User in der Liste _users nach seinen Mobilgeräten durchsucht wird.
    Wird ein Mobilgerät von einem User gefunden, dessen Name mit device.DeviceName übereinstimmt, dann soll dieses Mobilgerät an die Variable mobileDevice übergeben werden."
    Der Name des Mobilgerätes ist hier eindeutig. Den User benötige ich nicht.

    Viele Grüße
    Alexander
    Freitag, 22. Juni 2018 10:18
  • Hallo Alexander,

    ich fragte nur, weil dein Code nun so gar nicht zu deiner Anforderung gepasst hat.

    Jetzt ist es klar und Du kannst das Gewünschte bspw. so erreichen:

    String deviceName = "Device B 1";
    
    List<User> users = new List<User>();
    users.Add( new User() {
                            Name = "User A",
                            MobileDevices = new List<MobileDevice>() {
                                                                       new MobileDevice() { Name = "Device A 1" },
                                                                       new MobileDevice() { Name = "Device A 2" }
                                                                     }
                          } );
    users.Add( new User() {
                            Name = "User B",
                            MobileDevices = new List<MobileDevice>() {
                                                                       new MobileDevice() { Name = "Device B 1" },
                                                                       new MobileDevice() { Name = "Device B 2" }
                                                                     }
                           } );
    
    var mobileDevice = ( from u in users
                             from d in u.MobileDevices
                             where d.Name == deviceName
                             group d by d.Name
                             into r
                             select r.FirstOrDefault()
                       ).FirstOrDefault();
    

    Es gibt auch andere Wege und ggfs. hat sich hier noch ein Fehler eingeschlichen, es sollte dir aber zeigen, wie es generell geht und die ausreichend Denkanstöße liefern.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert AlexanderRi Freitag, 22. Juni 2018 11:35
    Freitag, 22. Juni 2018 10:56
    Moderator
  • Hallo Stefan,
    vielen Dank. Es funktioniert.

    Viele Grüße
    Alexander
    Freitag, 22. Juni 2018 11:35