Avatar billede Slettet bruger
12. juli 2008 - 23:28 Der er 11 kommentarer og
1 løsning

SQL til LINQ to SQL

Hej,

Jeg har følgende SQL statement som jeg ved virker:

select  SUM(amount) as amount,typeofore, charname
from Mining_Ores
where charname = 'maxss'
group by typeOfOre,charname;

Som giver mig:

182123    Dark Ochre            Maxss
700    Rich Plagioclase (+10%)    Maxss
700    Scordite            Maxss
300    Silvery Omber (+5%)    Maxss

Er der en som kan oversætte det til LINQ to SQL for mig, jeg har virkelig forsøgt lang tid, men jeg kan *ikke* finde en løsning :(
Avatar billede arne_v Ekspert
13. juli 2008 - 01:21 #1
Nu er det lidt svært at svare helt præcist uden at kende dine klasser.

Men jeg har lavet et eksempel - først med traditionel SQL og så det samme
med LINQ (i 2 varianter).

Du bør kunne løse dit problem udfra eksemplet.
Avatar billede arne_v Ekspert
13. juli 2008 - 01:21 #2
using System;
using System.Data;
using System.Data.SqlClient;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            using(SqlConnection con = new SqlConnection(@"Server=ARNEPC3\SQLEXPRESS;Integrated Security=SSPI;Database=Test"))
            {
                con.Open();
                SqlCommand sel1 = new SqlCommand("SELECT id,name,amount FROM somedata WHERE id > 1", con);
                SqlDataReader rdr1 = sel1.ExecuteReader();
                while(rdr1.Read())
                {
                    Console.WriteLine(rdr1["id"] + " " + rdr1["name"] + " " + rdr1["amount"]);
                }
                rdr1.Close();
                SqlCommand sel2 = new SqlCommand("SELECT name,SUM(amount) AS total FROM somedata WHERE id > 1 GROUP BY name", con);
                SqlDataReader rdr2 = sel2.ExecuteReader();
                while(rdr2.Read())
                {
                    Console.WriteLine(rdr2["name"] + " " + rdr2["total"]);
                }
                rdr2.Close();
            }
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
13. juli 2008 - 01:21 #3
using System;
using System.Linq;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Data.Linq.SqlClient;
using System.Data.SqlClient;

namespace E
{
    [Table(Name="somedata")]
    public class SomeData
    {
        [Column(Name="id",IsPrimaryKey=true)]
        public int Id;
        [Column(Name="name")]
        public string Name;
        [Column(Name="amount")]
        public decimal Amount;
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            using(SqlConnection con = new SqlConnection(@"Server=ARNEPC3\SQLEXPRESS;Integrated Security=SSPI;Database=Test"))
            {
                DataContext db = new DataContext(con);
                Table<SomeData> somedata = db.GetTable<SomeData>();
                var q1a = from sd in somedata
                        where sd.Id > 1
                        select new { sd.Id, sd.Name, sd.Amount };
                foreach(var r in q1a)
                {
                    Console.WriteLine(r.Id + " " + r.Name + " " + r.Amount);
                }
                var q1b = somedata.Where((sd) => sd.Id > 1).Select((sd) => new { sd.Id, sd.Name, sd.Amount });
                foreach(var r in q1b)
                {
                    Console.WriteLine(r.Id + " " + r.Name + " " + r.Amount);
                }
                var q2a = from sd in somedata
                        where sd.Id > 1
                        group sd by sd.Name into g
                        select new { Name=g.Key, Total=g.Sum((v) => v.Amount)};
                foreach(var r in q2a)
                {
                    Console.WriteLine(r.Name + " " + r.Total);
                }
                var q2b = somedata.Where((sd) => sd.Id > 1).GroupBy((v) => v.Name).Select((g) => new { Name=g.Key, Total=g.Sum((v) => v.Amount) });
                foreach(var r in q2b)
                {
                    Console.WriteLine(r.Name + " " + r.Total);
                }
            }
            Console.ReadKey();
        }
    }
}
Avatar billede Slettet bruger
13. juli 2008 - 09:55 #4
Hej Arne

Tak for dit svar, jeg skal kigge på det enten i aften eller i morgen.
Men umiddelbart så ligner q2b pænt meget det jeg selv var kommet frem til. Jeg syntes bare at det er svært at finde noget godt materiale på nettet om LINQ to SQL
Avatar billede arne_v Ekspert
13. juli 2008 - 15:12 #5
Man kan finde lidt. Man skal så frasortere det der var til tidlige beta versioner og som
ikke gælder længere.

Hvis du skal arbejde meget med det, så overvej at købe en eller flere bøger om emnet. Det
er et komplekst emne som ikke kan gennemgåes komplet i en 3 page online tutorial.
Avatar billede Slettet bruger
13. juli 2008 - 16:27 #6
Ja, det var tanken at jeg ville bruge det, primært til SQL, men det er også ret stærkt både til XML og Objects.
Er der nogen special bog du kan anbefale ?
Avatar billede arne_v Ekspert
13. juli 2008 - 16:33 #7
LINQ in Action / Fabrice Marguerie, Steve Eichert, Jim Wooley

var oplagt

C# in Depth / Jon Skeet

dækker alt det nye i C# 3.0 & .NET 3.5 inkl. LINQ i forskellige flavors
Avatar billede Slettet bruger
13. juli 2008 - 17:11 #8
Lige nu er det LINQ der er vigtigt for mig.
Jeg vil nok fokusere på mere af det nye senere. Jeg ved der er kommet ret meget godt :)
Avatar billede arne_v Ekspert
29. august 2008 - 02:39 #9
all set ?
Avatar billede Slettet bruger
29. august 2008 - 06:49 #10
Jeg havde sgu glemt det :)
Her dine point
Avatar billede arne_v Ekspert
29. august 2008 - 15:51 #11
Du skal lige markere mit navn og klikke accepter ...
Avatar billede Slettet bruger
29. august 2008 - 16:00 #12
ups - dumme mig ;)
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