Xamarin.Forms Portable:如何基于数据库创建饼图片?

时间:2016-07-29 10:28:07

标签: c# linq xaml xamarin xamarin.forms

大家好日子。我正在创建一个Xamarin.Forms便携式应用程序,其中我能够使用OxyPlot在那里显示一个饼图。

饼图包含6个切片,均为预定义。我的问题是,我将如何获得饼图,饼图基于我的数据库中的数据。

在我的 WebFormsProject 中,我创建了一个 SalesController ,其中我使用LINQ表达式来获取我需要的数据库中的所有数据。我还创建了一个 SalesViewModel ,在那里我声明了我拥有的所有属性。我尝试在我的WEB API中测试它,如果它确实返回一个值,那么它会返回一个值。

在我的PORTABLE项目中,我有一个创建的销售模型,该模型与 WebFormsProject 中的 SalesViewModel 具有完全相同的属性。我还有 SalesVM.cs ,其中我尝试使用SalesServices和RestClient访问 WebFormsProject 中的记录。

这些是我使用的代码。

的WebForms

1。) SalesViewModel.cs

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

namespace WebFormsDemo.ViewModel
{
    public class SalesViewModel
    {
        public int Id { get; set; }
        public int ORDER_ID { get; set; }
        public int ORDER_DETAILS_ID { get; set; }
        public int PRODUCT_ID { get; set; }
        public string PRODUCT_CODE { get; set; }
        public string NET_AMOUNT { get; set; }
    }
}

2。) SalesController.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;
using WebFormsDemo;
using WebFormsDemo.ViewModel;

namespace WebFormsDemo.Controllers
{
public class SalesController : ApiController
{
    private EBMSEntities db = new EBMSEntities();

    // GET: api/Sales
    public IQueryable<SalesViewModel> GetSalesViewModels()
    {
        //return db.SalesViewModels;
        var sales = from order in db.ORDERs
                    join order_detail in db.ORDER_DETAILS
                    on order.ORDER_ID equals order_detail.ORDER_ID
                    join prod in db.PRODUCTs
                    on order_detail.PRODUCT_ID equals prod.PRODUCT_ID
                    orderby order_detail.TOTAL_AMT_PER_ITEM descending
                    //group prod by prod.PRODUCT_CODE
                    group order_detail by prod.PRODUCT_CODE into od
                    select new SalesViewModel
                    {

                        PRODUCT_CODE = od.Key,
                        NET_AMOUNT = od.Sum(p => p.TOTAL_AMT_PER_ITEM).ToString(),

                    };

        return sales;


    }

    // GET: api/Sales/5
    [ResponseType(typeof(SalesViewModel))]
    public IHttpActionResult GetSalesViewModel(int id)
    {
        SalesViewModel salesViewModel = db.SalesViewModels.Find(id);
        if (salesViewModel == null)
        {
            return NotFound();
        }

        return Ok(salesViewModel);
    }

    // PUT: api/Sales/5
    [ResponseType(typeof(void))]
    public IHttpActionResult PutSalesViewModel(int id, SalesViewModel salesViewModel)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != salesViewModel.Id)
        {
            return BadRequest();
        }

        db.Entry(salesViewModel).State = EntityState.Modified;

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!SalesViewModelExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return StatusCode(HttpStatusCode.NoContent);
    }

    // POST: api/Sales
    [ResponseType(typeof(SalesViewModel))]
    public IHttpActionResult PostSalesViewModel(SalesViewModel salesViewModel)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.SalesViewModels.Add(salesViewModel);
        db.SaveChanges();

        return CreatedAtRoute("DefaultApi", new { id = salesViewModel.Id }, salesViewModel);
    }

    // DELETE: api/Sales/5
    [ResponseType(typeof(SalesViewModel))]
    public IHttpActionResult DeleteSalesViewModel(int id)
    {
        SalesViewModel salesViewModel = db.SalesViewModels.Find(id);
        if (salesViewModel == null)
        {
            return NotFound();
        }

        db.SalesViewModels.Remove(salesViewModel);
        db.SaveChanges();

        return Ok(salesViewModel);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }

    private bool SalesViewModelExists(int id)
    {
        return db.SalesViewModels.Count(e => e.Id == id) > 0;
        }
    }
}

XamarinFormsPortable

1。) Sales.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace XamarinFormsDemo.Models
{
public class Sales
{
    public int Id { get; set; }
    public int ORDER_ID { get; set; }
    public int ORDER_DETAILS_ID { get; set; }
    public int PRODUCT_ID { get; set; }
    public string PRODUCT_CODE { get; set; }
    public double NET_AMOUNT { get; set; }
    }
}

2。) SalesVM.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OxyPlot;
using OxyPlot.Series;
using OxyPlot.Xamarin.Forms;
using Xamarin.Forms;
using System.Runtime.CompilerServices;

using XamarinFormsDemo.Models;
using System.Collections.ObjectModel;
using XamarinFormsDemo.Services;

namespace XamarinFormsDemo.ViewModels

{
    public class SalesVM
    {
    private List<Sales> salesmodel { get; set; }


    public List<Sales> SalesModelvm
    {
        get
        {
            return salesmodel;
        }
        set
        {
            salesmodel = value;
            OnPropertyChanged();
        }
    }





    public SalesVM()
    {

        InitializeDataAsync();


    }

    private async Task InitializeDataAsync()
    {
        var salesServices = new SalesServices();
        SalesModelvm = await salesServices.GetSalesAsync();

    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }

    }
}

3.) SalesServices.cs

using Plugin.RestClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XamarinFormsDemo.Models;
namespace XamarinFormsDemo.Services
{
    public class SalesServices
    {

    public async Task<List<Sales>> GetSalesAsync()
    {
        RestClient_Sales<Sales> restClient = new RestClient_Sales<Sales>();

        var salesList = await restClient.GetSalesAsync();

        return salesList;

        }

    }
}

4。) RestClient.cs

    public class RestClient_Sales<T>
    {

    private const string WebServiceUrl = "http://localhost:50857/api/Sales/";

    public async Task<List<T>> GetSalesAsync()
    {
        var httpClient = new HttpClient();

        var json = await httpClient.GetStringAsync(WebServiceUrl);

        var taskModels = JsonConvert.DeserializeObject<List<T>>(json);

        return taskModels;
       }

    }

0 个答案:

没有答案