Avatar billede jens_k Nybegynder
06. oktober 2011 - 19:05 Der er 6 kommentarer

Hjælp til Linq query

Hej,

Jeg har et website lavet i ASP.NET MVC 3 (C#), databasen er en MS SQL 2008.

I min database har jeg to tabeller Users og Messages.

Users har følgende kolonner:

- Id (PK)
- Username (varchar)
- Age (varchar)
- City (varchar)

Messages har følgende kolonner:

- Id (PK)
- SentTo (int - indeholder Id på en bruger i Users)
- SentBy (int - indeholder Id på en bruger i Users)
- Content (text - indeholder beskeden)
- SentDate (datetime - tidspunkt for afsendelse)


Det skal så være sådan at i indbakken listes en afsender kun én gang, også selvom der er flere beskeder fra den samme afsender. I selve listen kan man se et kort udsnit af den sidste besked fra den pågældende afsender, noget i stil med Facebook.

Jeg har forsøgt mig, men er meget ny i dette, så jeg er ikke nået længere end til dette:

var Messages = (from r in db.Messages
    where r.SentTo == Basic.SessionUserID()
    select r.SentBy).Distinct().ToList();


Hvordan får jeg dette skrev færdigt (med et join til users) så jeg i samme sætning også kan få Messages.Content, Messages.SentDate og Users.Username med ud fra databasen.

Håber der er en ekspert som kan hjælpe.

/JensK
Avatar billede Syska Mester
07. oktober 2011 - 02:10 #1
var list = db.Message.Where(a => a.SentTo == Basic.SessionUserID()).ToList();

Problemet i den query du har lavet er sin select. ( Du tager kun r.SentBy ... altså får du en IQueryable<string> (Antaget at SentBy er en string)

Hvad du kan gøre er:
var Messages = (from r in db.Messages
    where r.SentTo == Basic.SessionUserID()
    select r).Distinct().ToList();

Så burde du få en IQueryable<Message> og dermed kan du lazy load user properties etc.

mvh
Avatar billede janus_007 Nybegynder
09. oktober 2011 - 00:33 #2
hmmm...

Hvis Users er den som skal vises med tilhørende en message så:

var users = db.Users(
x => new{x.Id, x.Username, x.Age, x.City, SidsteBesked = x.Messages.LastOrDefault()});

Du sætter selv din where clause ik :)

når du så skal have din user med besked frem så...
....
users.SidsteBesked.SentTo, users.SidsteBesked.SentBy osv.

Du har din relation modelleret så der er ingen grund til oldschool joins :)
Avatar billede solle Nybegynder
13. oktober 2011 - 22:24 #3
måske ude i noget GroupBy(...) ?
Avatar billede jens_k Nybegynder
15. oktober 2011 - 17:59 #4
Hej buzzzz og janus_007,

Jeg fik det lavet på en helt anden måde, men vil i ikke lige smide et svar?

/Jens_K
Avatar billede Syska Mester
15. oktober 2011 - 18:04 #5
Hvad er en helt anden måde? Måske andre kan bruge det til noget hvis de finder dit spm via Bing

mvh
Avatar billede jens_k Nybegynder
15. oktober 2011 - 18:18 #6
var db = new TestDB();
            var list = new List<MessagesOverview>();
            int UserId = Basic.SessionUserID();

            var Messages = (from m in db.Messages
                        where (m.SentTo == UserId && m.DeletedSentTo == false) || (m.SentBy == UserId && m.DeletedSentBy == false)
                        orderby m.Id descending
                        select new { m.SentTo, m.SentBy, m.Content, m.SentDate, m.ReadDate }).ToList();

            foreach (var item in Messages)
            {
                int tmpId;
                string tmpUsername;

                if (item.SentBy == UserId)
                {
                    tmpId = item.SentTo;
                    tmpUsername = Basic.Username(item.SentTo);
                }
                else
                {
                    tmpId = item.SentBy;
                    tmpUsername = Basic.Username(item.SentBy);
                }

                int info = list.Where(m => m.UserId == tmpId).Count();
               
                if (info == 0)
                {
                    var obj = new MessagesOverview();
                    obj.UserId = tmpId;
                    obj.Username = tmpUsername;
                    obj.ReadDate = item.ReadDate;
                    obj.SentDate = item.SentDate;
                    obj.Content = item.Content;
                    list.Add(obj);
                }
            }

            return View(list);
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester