Tuesday, March 15, 2016

Adding Artists to the Fan's List

I have made a method that can be included in the service to add artists the fan has selected to the fanArtist table.The code is commented to indicate what is going on.


 public int AddFanArtist( int fanKey, string artistName)
    {
        /*********************************
         * This method will add an artist to the artistFan
         * table. First we have to find the fan
         * and then the particular artist
         * Then we add the artist to the Fan's list
         * of artists to follow
         * **********************************/
        int result = 1;

        //get the fan. the key can come from their login
        Fan myFan = (from f in se.Fans
                     where f.FanKey == fanKey
                     select f).First();

        //get the artist by name
        Artist myArtist = (from a in se.Artists
                           where a.ArtistName.Equals(artistName)
                           select a).First();

        //add the artist to the fan;'s collection of artists
        myFan.Artists.Add(myArtist);

        //save the changes
        se.SaveChanges();

        return result;
    }
}

I also made a client method to show how you could use this. I used a CheckBoxList to select the artists from. Here is a picture of that on the web form

Obviously this could be made to look better. Here is the asp source code for the page


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <p>Select your artists and click enter to add them</p>
        <asp:CheckBoxList ID="CheckBoxList1" runat="server" RepeatColumns="3"></asp:CheckBoxList>
        <asp:Button ID="Button1" runat="server" Text="Add Artists" OnClick="Button1_Click" />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </div>
    </form>
</body>
</html>


Here is the code behind


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    ServiceReference1.FanArtistServiceClient sc = new ServiceReference1.FanArtistServiceClient();
    protected void Page_Load(object sender, EventArgs e)
    {
        //I hard coded the key in so I didn't have to do the login 
        //for this example
        Session["key"] = 2;
        if (!IsPostBack)
            PopulateArtists();
        
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        AddArtists();
    }

    protected void PopulateArtists()
    {
        //this method populates the CheckboxList
        //with artist names
        string[] artists = sc.GetArtist();
        CheckBoxList1.DataSource = artists;
        CheckBoxList1.DataBind();
    }

    protected void AddArtists()
    {
        //get the fan's key
        int key = (int)Session["key"];

        //loop through the checkboxList
        //to see what's checked
        foreach(ListItem i in CheckBoxList1.Items)
        {
            //if it is checked call the service method to add
            //it to the database
            if(i.Selected)
            {
                int x = sc.AddFanArtist(key, i.Text);
            }
        }
        Label1.Text = "Artist have been added";
        CheckBoxList1.Items.Clear();
    }
}

The next thing to do will be to make a query of all the artists and their shows for a particular fan. Here is my first take on that method. It works but could be made more elegant perhaps. This method also goes in the service.


 public List<ShowInfo> GetShowsForFanArtists(int fanKey)
    {
        //get the fan
        Fan myFan = (from f in se.Fans
                     where f.FanKey == fanKey
                     select f).First();

        List<ShowInfo> shows = new List<ShowInfo>();

        //this loop within a loop is very inefficient
         foreach(Artist a in myFan.Artists)
         {
             //get all the shows for the fan
             var shws = from s in se.Shows
                        from sd in s.ShowDetails
                        where sd.ArtistKey == a.ArtistKey
                        select new
                        {
                            s.ShowName,
                            s.ShowTime,
                            s.ShowDate,
                            s.ShowTicketInfo,
                            s.Venue.VenueName,
                            sd.Artist.ArtistName
                        };

             //loop through the shows and write them to 
             //ShowInfo objects then add those objects
             //to the list
             foreach(var sh in shws)
             {
                 ShowInfo info = new ShowInfo();
                 info.ShowName = sh.ShowName;
                 info.ShowDate = sh.ShowDate.ToString();
                 info.ShowTime = sh.ShowTime.ToString();
                 info.TicketInfo = sh.ShowTicketInfo;
                 info.VenueName = sh.VenueName;
                 info.ArtistName = sh.ArtistName;

                 shows.Add(info);
             }
             
             
         }
         return shows;
                  
    }

No comments:

Post a Comment