[C# / LINQ] Kan geen Elements.Count binden aan GridView?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 06-09 20:35

Wijnbo

Electronica werkt op rook.

Topicstarter
Hallo, ik zit met een vreemd probleempje.

Tabel dbPlayListOnSystems:

PlaylistID (PK,FK,uniqueidentifier, not null)
SystemID (PK,FK,uniqueidentifier, not null)

Tabel dbPlayList:

Guid (pk, uniqueidentifier, not null)
XML (XML(.), not null)
ScheduleGUID(FK, uniqueidentifier, null)
UserId(FK,uniqueidentifier, not null)

Gridview heet GvPlaylists.

Relevante code:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
 var playlists = from playlist in datacontext.dbPlayListOnSystems
                                where playlist.SystemID.Equals(systemGuid)
                                select
                                    new
                                        {
                                            playlist.dbPlayList,
                                            id = playlist.dbPlayList.GUID,
                                            name = "HIERKOMTDEPLAYLISTNAAM",
                                            
                                        };
                GvPlaylists.DataSource = playlists;
                GvPlaylists.DataBind();


Bovenstaande code gaat goed.


Echter, als ik van de XML in de database, wat volgens linq een XElement is (jóh!) de Elements.Count op wil vragen en wil binden:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
var playlists = from playlist in datacontext.dbPlayListOnSystems
                                where playlist.SystemID.Equals(systemGuid)
                                select
                                    new
                                        {
                                            playlist.dbPlayList,
                                            id = playlist.dbPlayList.GUID,
                                            name = "HIERKOMTDEPLAYLISTNAAM",
                                            elementCount = playlist.dbPlayList.XML.Elements().Count(),
                                        };
                GvPlaylists.DataSource = playlists;
                GvPlaylists.DataBind();



krijg ik deze Exception:
Methode System.Collections.Generic.IEnumerable`1[System.Xml.Linq.XElement] Elements() heeft geen ondersteunde vertaling naar SQL.
Deze treed op bij de
C#:
1
GvPlaylists.DataBind();
methode.

Het stomme is, dat het WEL lukt als ik een selectie doe rechtstreeks uit datacontext.dbPlayList. Hoe kan dit?

Overigens gaat playlist.dbPlayList.XML.Elements().Name ofzo wel gewoon goed |:(

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
De gehele 'playlists' query wordt in de database uitgevoerd. De playlist.dbPlayList.XML.Elements.Count() scalar subquery kan hij niet converteren naar SQL vanwege .Count, wat een XQuery vereist en die maakt Linq to Sql niet standaard voor je.

Dat het anders wel goed gaat is omdat je dan de query eerst uitvoert op de database en dan in-memory de .Elements method aanroept.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 06-09 20:35

Wijnbo

Electronica werkt op rook.

Topicstarter
EfBe schreef op zondag 31 mei 2009 @ 11:06:
De gehele 'playlists' query wordt in de database uitgevoerd. De playlist.dbPlayList.XML.Elements.Count() scalar subquery kan hij niet converteren naar SQL vanwege .Count, wat een XQuery vereist en die maakt Linq to Sql niet standaard voor je.

Dat het anders wel goed gaat is omdat je dan de query eerst uitvoert op de database en dan in-memory de .Elements method aanroept.
Ah oke. Ik vermoede al zoiets maar kon geen informatie er over vinden. Enig idee hoe ik dit kan oplossen? Vind het namelijk beetje kansloos om eerst data te binden aan de gridview, dan een foreach er achter aan gooien die een extra kolom aan de gridview knupt met de Elements.Count waarde (die dan wel beschikbaar is dus)

Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 08:50
Je hoeft niet te databinden en dan pas te foreachen ? Dit lijkt me vrij normale code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var playlists = (from playlist in datacontext.dbPlayListOnSystems
                                where playlist.SystemID.Equals(systemGuid)
                                select
                                    new
                                        {
                                            playlist.dbPlayList,
                                            id = playlist.dbPlayList.GUID,
                                            name = "HIERKOMTDEPLAYLISTNAAM",
                                            elementCount = 0,
                                        }).ToList();
foreach(var playList in playLists) {
  playList.elementCount = dbPlayList.XML.Elements().Count()
}

                GvPlaylists.DataSource = playlists;
                GvPlaylists.DataBind();

[ Voor 3% gewijzigd door creator1988 op 02-06-2009 21:10 ]


Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 06-09 20:35

Wijnbo

Electronica werkt op rook.

Topicstarter
creator1988 schreef op dinsdag 02 juni 2009 @ 21:09:
Je hoeft niet te databinden en dan pas te foreachen ? Dit lijkt me vrij normale code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var playlists = (from playlist in datacontext.dbPlayListOnSystems
                                where playlist.SystemID.Equals(systemGuid)
                                select
                                    new
                                        {
                                            playlist.dbPlayList,
                                            id = playlist.dbPlayList.GUID,
                                            name = "HIERKOMTDEPLAYLISTNAAM",
                                            elementCount = 0,
                                        }).ToList();
foreach(var playList in playLists) {
  playList.elementCount = dbPlayList.XML.Elements().Count()
}

                GvPlaylists.DataSource = playlists;
                GvPlaylists.DataBind();
Niet aan gedacht dat je het ook eerst op 0 kon zetten

8)7

Thx!

Leuk joh, blindstaren op code en dan zo'n simpele oplossing.

Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 06-09 20:35

Wijnbo

Electronica werkt op rook.

Topicstarter
Hm, werkt dus toch niet. De properties van playlist zijn readonly :'(

Dus toch maar met de losse kolom toevoegen aan de gridview methode gedaan.

[ Voor 22% gewijzigd door Wijnbo op 04-06-2009 10:57 ]


Acties:
  • 0 Henk 'm!

  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 20-09 17:48

Peetman

Tjah....

Je kan in die new in de LINQ query ook een eigen object Playlist object aanmaken. Dan heb je wat meer control over je properties.

Voorbeeld:
C#:
1
2
3
4
IEnumerable<MyType> result =
from s in aBunchOfWords
where s.Length == 5
select new MyType {Value=s, Length=s.Length, FirstThreeLetters=s.Substring(0,3)};

Acties:
  • 0 Henk 'm!

  • mOrPhie
  • Registratie: September 2000
  • Laatst online: 18-09 15:41

mOrPhie

❤️❤️❤️❤️🤍

Properties van anonymous types zijn altijd -per definitie- read only. Wat peetman zegt is dus niet alleen de oplossing, het is ook nog 'ns veel beter om design-technisch altijd zo toe te passen. Bovendien maakt het imho leesbaardere code. :)

Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.


Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 06-09 20:35

Wijnbo

Electronica werkt op rook.

Topicstarter
mOrPhie schreef op zondag 07 juni 2009 @ 00:17:
Properties van anonymous types zijn altijd -per definitie- read only. Wat peetman zegt is dus niet alleen de oplossing, het is ook nog 'ns veel beter om design-technisch altijd zo toe te passen. Bovendien maakt het imho leesbaardere code. :)
Dat, en is het niet zo dat als je een "nieuw" object aanmaakt, dat je SubmitChanges(); dan niet meer werkt op dat object? Of snap ik Linq dan niet helemaal?

Ik neem aan dat je niet zomaar alle waardes in een object kunt kwakken die toevallig overeenkomen met een record uit de database, en vervolgens submitchanges op zo'n ding kunt doen? Want in latere regels code wordt er nog wat aan gewijzigd ;)

Acties:
  • 0 Henk 'm!

  • mOrPhie
  • Registratie: September 2000
  • Laatst online: 18-09 15:41

mOrPhie

❤️❤️❤️❤️🤍

Wijnbo schreef op zondag 07 juni 2009 @ 11:50:
[...]


Dat, en is het niet zo dat als je een "nieuw" object aanmaakt, dat je SubmitChanges(); dan niet meer werkt op dat object? Of snap ik Linq dan niet helemaal?
Nee, maar dat is nogal wiedes. Een nieuw object is geen Table en heeft dus ook geen mappings met een database. Als je dat wilt, kun je beter een nieuwe class maken in de dbml en die gebruiken. :)
Ik neem aan dat je niet zomaar alle waardes in een object kunt kwakken die toevallig overeenkomen met een record uit de database, en vervolgens submitchanges op zo'n ding kunt doen? Want in latere regels code wordt er nog wat aan gewijzigd ;)
Ik weet niet wat je precies bedoelt, maar als je stateless werkt (dus bij bijvoorbeeld ASP.NET), dan heeft het sowieso geen zin om twee kanten op te binden. Bij je save ben je namelijk je state kwijt en begrijpt linq het toch al niet meer. Je kunt dit oplossen met Attach-constructies, maar hiervoor is wel vereist dat je een datestamp bijhoudt op elke tabel in je database.

Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.

Pagina: 1