Avatar billede 2AA Nybegynder
22. januar 2010 - 18:57 Der er 19 kommentarer og
1 løsning

Søg i produkter

hej

skal have lavet en søgeformular, som skal søge igennem mine produkter. Har nogle checkboxe og textboxe imellem som skal filtreres. Bruger dal, bll (nybegynder)!

Hvordan gør jeg dette? -hvis i kan refererer til noget kode, vil det være lækkert!
Avatar billede arne_v Ekspert
22. januar 2010 - 19:20 #1
Der er mange maader at gribe det an paa.

Du kan skrive dit eget DAL fra bunden af og bruge en XxxxDataReader til at hente ind i en List<Product>.

Hvis din database understoetter LINQ kan du bruge LINQ til at hente en IEnumrable<Product>.

Har du faaet lavet de basale domain klasse (Product etc.) ?

Har du besluttet dig for hvilken logik der skal vaere i dit BLL ?
Avatar billede 2AA Nybegynder
22. januar 2010 - 20:08 #2
hej

Det er en test, så har fulgt denne tutorial fra asp.net: http://msdn.microsoft.com/en-us/library/aa581779.aspx

Hvordan ville du bygge det op, hvis det var dig? -hvor du skal lave en søgeformular med filtrering af ProductName, Unitprice, CategoryName, UnitsInStock, Country.
Avatar billede arne_v Ekspert
22. januar 2010 - 20:16 #3
De bruger saa typed data set.

Jeg ville foretraekke en List af en custom klasse og en data reader fremfor data set.

Men det er lidt som hvorvidt man er til VW eller Toyota.

Baade data set og data reader er SQL baseret.

Og som den tutorial viser saa konstruerer man sin SQL saetning udfra hvad der skal soeges efter og bruger parameters til at saette de faktisk vaerdier paa runtime.
Avatar billede arne_v Ekspert
22. januar 2010 - 20:18 #4
Hvis du har det klassiske problem med hvordan man faar ingen filtervaerdi til at betyde alle, saa er der et lille trick:

SELECT ... WHERE ... AND felt=ISNULL(@felt, felt) AND ...

hvis man saa saetter @felt til NULL, saa ignorerer den dette kriterie.
Avatar billede 2AA Nybegynder
22. januar 2010 - 20:46 #5
ok hvade ikke regnet med at det var sql jeg skulle bruge. skal der ikke bruges mere kode?
Avatar billede arne_v Ekspert
22. januar 2010 - 20:57 #6
Lad mig se om ikke jeg kan bixe et eksempel.
Avatar billede 2AA Nybegynder
23. januar 2010 - 04:04 #7
det ville jeg være glad for
Avatar billede janus_007 Nybegynder
23. januar 2010 - 23:12 #8
Hej 2AA (igen)

Jeg ville 100% droppe at følge den tutorial, det er totalt overgjort synes jeg. Alt for meget kode :)

Den udnytter heller intet af de nye features der findes i frameworket, hvilket er klart da den er fra 2006 :)

Læs hellere om Linq: http://weblogs.asp.net/scottgu/archive/2006/05/14/Using-LINQ-with-ASP.NET-_2800_Part-1_2900_.aspx

Det vil bringe dig up to speed i løbet af no-time, så hvis du bruger SQL Server så er vejen klar :)

Hvis ikke du bruger SQL Server, så vil jeg råde dig i samme retning som arne, nemlig IList/ IEnumerable
Avatar billede arne_v Ekspert
25. januar 2010 - 01:27 #9
Her et et eksempel.

Først interfacet:


    public interface IDAL
    {
        T1 GetOneT1(int f1);
        IList<T1> GetAllT1();
        IList<T1> GetFilterT1(int? f1, string f2);
    }


Så en implementation med data reader:


    public class DataReaderDAL : IDAL
    {
        private IDbConnection GetConnection()
        {
            DbProviderFactory dbf = DbProviderFactories.GetFactory(ConfigurationManager.ConnectionStrings["Test"].ProviderName);
            IDbConnection con = dbf.CreateConnection();
            con.ConnectionString = ConfigurationManager.ConnectionStrings["Test"].ConnectionString;
            con.Open();
            return con;
        }
        public T1 GetOneT1(int f1)
        {
            using(IDbConnection con = GetConnection())
            {
                string paramprefix = ConfigurationManager.AppSettings["ParamPrefix"];;
                IDbCommand sel = con.CreateCommand();
                sel.CommandText = "SELECT f1,f2 FROM t1 WHERE f1 = " + paramprefix + "f1";
                sel.Connection = con;
                IDbDataParameter p = sel.CreateParameter();
                p.ParameterName = paramprefix + "f1";
                p.DbType = DbType.Int32;
                p.Value = f1;
                sel.Parameters.Add(p);
                using(IDataReader rdr = sel.ExecuteReader())
                {
                    if(rdr.Read())
                    {
                        return new T1 { F1 = (int)rdr["f1"], F2 = (string)rdr["f2"]};
                    }
                    else
                    {
                        return null;
                    }
                }
            }
        }
        public IList<T1> GetAllT1()
        {
            IList<T1> res = new List<T1>();
            using(IDbConnection con = GetConnection())
            {
                IDbCommand sel = con.CreateCommand();
                sel.CommandText = "SELECT f1,f2 FROM t1";
                sel.Connection = con;
                using(IDataReader rdr = sel.ExecuteReader())
                {
                    while(rdr.Read())
                    {
                        res.Add(new T1 { F1 = (int)rdr["f1"], F2 = (string)rdr["f2"]});
                    }
                }
            }
            return res;
        }
        public IList<T1> GetFilterT1(int? f1, string f2)
        {
            IList<T1> res = new List<T1>();
            using(IDbConnection con = GetConnection())
            {
                string isnull = ConfigurationManager.AppSettings["ISNULL"];
                string paramprefix = ConfigurationManager.AppSettings["ParamPrefix"];;
                IDbCommand sel = con.CreateCommand();
                sel.CommandText = "SELECT f1,f2 FROM t1 WHERE f1=" + isnull + "(" + paramprefix + "f1,f1) AND f2 LIKE " + isnull + "(" + paramprefix + "f2, f2)";
                sel.Connection = con;
                IDbDataParameter p1 = sel.CreateParameter();
                p1.ParameterName = paramprefix + "f1";
                p1.DbType = DbType.Int32;
                p1.Value = f1 != null ? (object)f1 : (object)DBNull.Value;
                sel.Parameters.Add(p1);
                IDbDataParameter p2 = sel.CreateParameter();
                p2.ParameterName = paramprefix + "f2";
                p2.DbType = DbType.String;
                p2.Value = f2 != null ? (object)f2 : (object)DBNull.Value;
                sel.Parameters.Add(p2);
                using(IDataReader rdr = sel.ExecuteReader())
                {
                    while(rdr.Read())
                    {
                        res.Add(new T1 { F1 = (int)rdr["f1"], F2 = (string)rdr["f2"]});
                    }
                }
            }
            return res;
        }
    }


Hvis man har mulighed for LINQ, så kan ihvertfald så simple queries laves langt nemmere med LINQ.

En implementation med LINQ til Entity Framework:


    public class LINQtoEFDAL : IDAL
    {
        public T1 GetOneT1(int f1)
        {
            using(TestContext ctx = new TestContext())
            {
                return ctx.T1.Where(t1 => t1.F1==f1).First();
            }
        }
        public IList<T1> GetAllT1()
        {
            using(TestContext ctx = new TestContext())
            {
                return ctx.T1.ToList();
            }
        }
        public IList<T1> GetFilterT1(int? f1, string f2)
        {
            using(TestContext ctx = new TestContext())
            {
                return ctx.T1.Where(t1 => (f1==null || t1.F1==f1) && (f2==null || t1.F2.Contains(f2))).ToList();
            }
        }
    }


I eksemplet med data reader er T1 klassen håndskrevet:


    public class T1
    {
        public int F1 { get; set; }
        public string F2 { get; set; }
    }


I eksemplet med LINQ til EF er T1 klassen genereret.

Det sidste re naturligvis noget roderi, men det skulle så være fixet i .NET 4.0 som udkommer om nogle få måneder.
Avatar billede 2AA Nybegynder
25. januar 2010 - 20:47 #10
tak arne_v og janus_007! Lyder spændende, vil gå igang med at forstå og lære LINQ noget bedre ;-)

arne_v giver du et svar!
Avatar billede arne_v Ekspert
25. januar 2010 - 20:52 #11
svar
Avatar billede arne_v Ekspert
25. januar 2010 - 20:53 #12
Der er ioevrigt en lille halv-subtil fejl i mine to DAL implementeringer. Filter paa F2 fungerer ikke helt ekvivalent i de to.
Avatar billede 2AA Nybegynder
28. januar 2010 - 15:54 #13
Hvad mener i om, at mange siger LINQ er et uddødt sprog?
Avatar billede arne_v Ekspert
28. januar 2010 - 16:05 #14
Uddoedt????

LINQ er kun 2 aar gammelt.

LINQ to EF er 1 aar gammelt.

Det er flunkende nyt.
Avatar billede arne_v Ekspert
28. januar 2010 - 16:12 #15
Om LINQ har en stor fremtid foran sig eller vil uddoe vil vise sig i de kommende 5 aar.
Avatar billede 2AA Nybegynder
28. januar 2010 - 16:25 #16
ok.. kan det passe at det så er linq to sql som mange mener vil dø?
Avatar billede arne_v Ekspert
28. januar 2010 - 16:33 #17
Ja.

LINQ to EF har afloest LINQ to SQL.

LINQ to SQL er doedt, fordi MS har lavet en bedre LINQ loesning.
Avatar billede 2AA Nybegynder
02. februar 2010 - 08:55 #18
Men er det ikke stadig muligt at bruge LINQ to SQL kode i LINQ to EF ?
Avatar billede arne_v Ekspert
02. februar 2010 - 15:09 #19
Nej.

Men de ligner hinanden saa meget at jeg kan heller ikke se pointen.
Avatar billede janus_007 Nybegynder
03. februar 2010 - 00:16 #20
Linq to Entities er udviklet af ADO.NET teametog Linq to Sql er udviklet af C# teamet.

Linq to Entities er meget mere kompliceret at anvende, selv simple ting er forplumret med gammeldags ADO.NET koncepter. Trist.... Jeg håber virkelig L2E4.0 bliver godt :) Har ikke haft muligheden for at afprøve det (tidsmangel)

Så hvad der er bedst... tjaaa... ADO.NET har jo tilsyneladende stadig en finger med i spillet, besynderligt når nu C# teamet er rasende dygtige. Men hov... var det ikke mere i gamle dage man havde ADO.NET *GG*, anyway!

Alle kan sætte sig ned med L2S, så jo... der er skam forskel. Tag bare manglen på sprocs, en ting de dog har fået rettet i 4.0, meeen alligevel.

Og nej Linq to Sql er ikke uddødt, Microsoft har besluttet sig for at understøtte det, dog skal man nok ikke regne med de helt store tiltag af nye feaures.

2AA, ikke blande koncepterne sammen, Linq er ikke Linq to Sql eller Linq to Entities ;)
Og nej Linq dør nok ikke lige med det samme, det lader til at folk er ved at få øjnene op for at der findes andre udviklingsmetoder end for-each og if-then :) Og hvem vil ikke gerne spare kode?
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
Kurser inden for grundlæggende programmering

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