Использование Dapper в контексте метода для возврата нескольких списков - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть класс вендора, подобный этому:

    public class Vendor: DataAccess
        {
            //properties
            public int VEND_ID;
            public string VEND_NAME { get; set; }
            public string VEND_ADDRESS { get; set; }
            public string VEND_PHONE { get; set; }
            public string VEND_WEBSITE { get; set; }
            public string NOTES { get; set; }

            public static string ErrorMessage { get; set; }
            //Constructors
            public Vendor(string name,string address,string phone,string website,string notes)
            {
                VEND_NAME = name;
                VEND_ADDRESS = address;
                VEND_PHONE = phone;
                VEND_WEBSITE = website;
                NOTES = notes;
            }
            public Vendor(string name)
            {
                VEND_NAME = name;
            }
            public Vendor() { }  
)

У меня есть класс заказов, подобный этому:

public class Order: DataAccess
{
    //properties
    public int ORDER_ID { get; set; }
    public Vendor VENDOR_ID { get; set; }
    public string ENTRY_DATE { get; set; }
    public string ORDER_NO { get; set; }
    public string TOTAL_COST { get; set; }
    public string STATUS { get; set; }
    public string NOTES { get; set; }
    public string ATTACH_ID { get; set; }
    public static string ErrorMessage { get; set; }
    //constructors
    //public Order(string )
}

Мой класс доступа к данным имеет следующий метод:

public Tuple<List<Vendor>, List<Order>> GetVendorByName(string name)
{
    using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.CnnVal("TESTDB")))
    {
        using (var multi = connection.QueryMultiple("dbo.GetVendor_ByName", new { VEND_NAME = name }))
        {

            List<Vendor> vd=new List<Vendor>();
            vd.Add(multi.Read<Vendor>().First());
            List<Order> od = new List<Order>();
            od.Add(multi.Read<Order>().Single());
            var output = Tuple.Create(vd, od);
            return output;
        }
        //var output = connection.QueryMultiple<Vendor>("dbo.GetVendor_ByName", new { VEND_NAME = name }).ToList();

    }
}

Основной класс использует его следующим образом:

List<Vendor> vendor = new List<Vendor>();
    private void _search_Click(object sender, EventArgs e)
    {
        Vendor db = new Vendor(cb_vendor.Text);
        vendor=db.GetVendorByName(cb_vendor.Text);//This is where the error is pointed at
        //dgv_data.Refresh();
        dgv_data.DataSource = vendor;
    } 

Я пытаюсь получить данные из процедуры SQL для отображения в DataGridView (dgv_data). Между Продавцом и Порядком существует связь один ко многим. Я хочу получить все Заказы для любого выбранного имени Продавца
Я знаю, что проблема в том, что я возвращаю Список. Я пытался использовать Tuples, но без радости, это дает мне ошибку о неявных преобразованиях. Любая идея, как сделать то, что я пытаюсь сделать sh?

Ошибка CS0029 Невозможно неявно преобразовать тип 'System.Tuple, System.Collections.Generi c .List>' в 'System.Collections.Generi c .List' PurchaseApp

Update1:
Хранимая процедура выглядит следующим образом:

ALTER proc [dbo].[GetVendor_ByName]

  (
  @VEND_NAME varchar(100)
  )
  as
  Select Distinct a.VEND_NAME,b.* from dbo.Purch_Vendor a left join purch_order b on a.vendor_id=b.vendor_id  where a.Vend_Name=@VEND_NAME

1 Ответ

0 голосов
/ 10 февраля 2020

Попробуйте это. Он отображает заказы продавцу на имя. Я добавил свойство для списка заказов поставщику

public class Vendor : DataAccess
{
    //properties
    public int VEND_ID;
    public string VEND_NAME { get; set; }
    public string VEND_ADDRESS { get; set; }
    public string VEND_PHONE { get; set; }
    public string VEND_WEBSITE { get; set; }
    public string NOTES { get; set; }
    public List<Order> ORDERS { get; set; }

    public static string ErrorMessage { get; set; }
    //Constructors
    public Vendor(string name, string address, string phone, string website, string 
    notes)
    {
        VEND_NAME = name;
        VEND_ADDRESS = address;
        VEND_PHONE = phone;
        VEND_WEBSITE = website;
        NOTES = notes;
    }
    public Vendor(string name)
    {
        VEND_NAME = name;
    }
    public Vendor() { }
}

public class Order : DataAccess
        {
            //properties
            public int ORDER_ID { get; set; }
            public Vendor VENDOR_ID { get; set; }
            public string ENTRY_DATE { get; set; }
            public string ORDER_NO { get; set; }
            public string TOTAL_COST { get; set; }
            public string STATUS { get; set; }
            public string NOTES { get; set; }
            public string ATTACH_ID { get; set; }
            public static string ErrorMessage { get; set; }
            //constructors
            //public Order(string )
        }
 public Vendor GetVendorByName(string name)
        {
            using (IDbConnection connection = new 
              SqlConnection(Helper.CnnVal("TESTDB")))
            {
                var dict = new Dictionary<string, Vendor>();

                var vendors = connection.Query<Vendor, Order, Vendor> 
               ("dbo.GetVendor_ByName", (a, b) => Mapper(a, b, dict), new { 
                VEND_NAME = name }, splitOn: "ORDER_ID");

                return dict.Values.FirstOrDefault()

            }
        }

 public Vendor Mapper(Vendor vendor, Order order, Dictionary<string, Vendor> dict)
        {
            if (!dict.ContainsKey(vendor.VEND_NAME))
            {
                vendor.ORDERS = new List<Order>();
                dict.Add(vendor.VEND_NAME, vendor);
            }
            var currentVendor = dict[vendor.VEND_NAME];

            currentVendor.ORDERS.Add(order);

            return currentVendor;
        }
...