WebHU - Programozási kérdések és válaszok

A LINQ to Entities nem ismeri fel a ToArray-t

Olyan lekérdezést próbálok írni, amely egy DTO-ra vetít, ahol a tulajdonságok közül kettő int tömb. Hibaüzenetet kapok a ToArray() hívás miatt a vetítésben.

teams = context
  .Teams
  .Include("TeamDepartments")
  .Include("TeamEmployees")
  .Select(t => new TeamDto
      {
          sourceSystemId = t.TeamId,
          name = t.Name,
          manager = t.EmployeeIdTeamManager,
          teamLead = t.EmployeeIdTeamLead,
          employees = t.TeamEmployees.Select(te => te.EmployeeId).ToArray(),
          departments = t.TeamDepartments.Select(td => td.DepartmentId).ToArray()
       })
  .ToList();

Az alkalmazottak és a részlegek esetében, amelyek a két int[ ] tulajdonság, hogyan szerezhetem meg ezeket az értékeket? Egyelőre csak visszahúzom a csapatok listáját, majd körbejárom őket, hogy létrehozzam a DTO-t.

Láttam más hasonló kérdéseket is, de úgy tűnik, hogy a megoldások nem működnek számomra. Gyanítom, hogy van még egy lépés, amit meg kell tennem, mert keresztülmegyek egy kapcsolaton.

24.05.2013

  • El tudnád küldeni a TeamDto entitást? 24.05.2013

Válaszok:


1

Ezt a lekérdezést két különböző lépésre kell szétválasztania; az első lekéri a helyes eredményeket, a második pedig kivetíti az adatokat a DTO-ba. Mint ez:

teams = context
  .Teams
  .Include("TeamDepartments")
  .Include("TeamEmployees")
  .Select(t => new // notice this is an anonymous object
      {
          sourceSystemId = t.TeamId,
          name = t.Name,
          manager = t.EmployeeIdTeamManager,
          teamLead = t.EmployeeIdTeamLead,
          employees = t.TeamEmployees.Select(te => te.EmployeeId),
          departments = t.TeamDepartments.Select(td => td.DepartmentId)
       })
  .ToList() // first run the query on the server without the ToArray calls
  .Select(obj => new TeamDto
      {     // then project the in-memory results onto your DTO.
          sourceSystemId = obj.sourceSystemId,
          name = obj.name,
          manager = obj.manager,
          teamLead = obj.teamLead,
          employees = obj.employees.ToArray(),
          departments = obj.departments.ToArray()
      })
  .ToList();
24.05.2013
  • Esetleg hagyja ki az első ToList()-t, hogy elkerülje a többletköltséget, mivel az első lekérdezés eredményéből kiválaszthat egy Select-et, azaz az IQueryable-t. 24.05.2013
  • Az első ToList azért szükséges, mert a lekérdezést le kell futtatni a szerveren a következő Select hívás előtt, amely a ToArray hívásokkal vetíti a DTO-t, mivel ezek a hívások nem fordíthatók SQL-re. 24.05.2013
  • Értem! Köszönöm szépen a magyarázatot! 24.05.2013
  • Ezt a választ feltétlenül jelölje meg elfogadottként, miután tesztelte a megoldást, hogy megbizonyosodjon arról, hogy az megfelel az Ön igényeinek. 24.05.2013
  • Nem én vagyok a kérdés tulajdonosa! Csak egy pillantást vetettem a problémára, és kétségeim támadtak, hogy nagyon jól elmagyaráztad! 24.05.2013
  • Hoppá, béna. :) Örülök, hogy segíthettem! 24.05.2013
  • Igen, ez valójában sokkal jobb megoldás, mint amit adtam, de nem zavarja, hogy megmagyarázza, miért nem működik az eredeti lekérdezés, és miért nem az Öné. Semmit sem javít az OP megértésében. 24.05.2013

  • 2

    Azt hiszem, az a probléma, hogy a ToArray-t próbálja meghívni azon a blokkon belül, amelyet az SQL-szolgáltató SQL-lekérdezéssé alakít át. Természetesen az SQL Servernek fogalma sincs, mi az a tömb, így az a módszer nem működik. Mi történik, ha eltávolítja a ToArray hívást? Úgy gondolom, hogy ezek az eredmények IEnumberables néven jelennek meg a blokkon kívül, szükség szerint konvertálhatja őket. Nem vagyok benne biztos, hogy ez működni fog, de ha a következő módon módosítja a TeamDto definícióját, az megoldhatja a problémát.

     // you have now something like
     string[] employees;
     // instead do
     IEnumberable<string> employees;
     // If you want an array add
     string[] _employees;
    

    Ezután a lekérdezésen kívül _employees = employees.ToArray();

    24.05.2013
  • ez gyakori probléma a Linq2Sql EF-re konvertálásakor, mivel a Linq2Sql lehetővé teszi ezt (persze az SQL Server továbbra sem értelmezi a ToArray hívást) 25.09.2016
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..