c # Как добавить dapperRow к строго типизированному объекту, отображаемому в виде таблицы

#c# #sql #wpf #mvvm #dapper

#c# #sql #wpf #mvvm #dapper

Вопрос:

Я уверен, что у меня нет наилучшего практического решения, подобного тому, которое могло бы программировать большинство из вас, ребята, но я новичок в бизнесе, поэтому, пожалуйста, дайте мне шанс: P

я создал таблицу в своей базе данных sqlite и добавил сотрудника в таблицу Employee. Я установил DataContext моего GridView в возвращаемый список из моего ModelView. Но моя сетка пустая. я предполагаю, что у меня есть логическая ошибка в процессе преобразования моего dapperRow. Пожалуйста, взгляните на это. я не получаю сообщение об ошибке или что-то в этом роде. Мой GridView просто пуст.

  public List<Employee> GetAllEmployees()
    {
        List<Employee> employees = new List<Employee>();
        List<dynamic> results = _dataAccess.SelectAllEmployees();
        List<IDictionary<string, object>> dapperRowDic = results.Select(x => (IDictionary<string, object>)x).ToList();
        foreach(var dapperRow in dapperRowDic)
        {
            object id;
            object firstName;
            object lastName;
            object experience;
            object salary;

            dapperRow.TryGetValue("ID", out id);
            dapperRow.TryGetValue("FirstName", out firstName);
            dapperRow.TryGetValue("LastName", out lastName);
            dapperRow.TryGetValue("Experience", out experience);
            dapperRow.TryGetValue("Salary", out salary);

            employees.Add(new Employee((int)(long)id,(string)firstName,(string)lastName, (int)(long)experience, (int)(long)salary));
        }

        return employees;
    }

public class SQLiteDataAccess : IDataAccess
{
    public SQLiteDataAccess()
    {
        if (!File.Exists(SqLiteBaseRepository.DbFile))
            CreateDatabase();
    }

    public void InsertEmployee(int id,string firstName, string lastName, int experience, int salary)
    {
        using (var con = SqLiteBaseRepository.SimpleDbConnection())
        {
            var parameters = new { FIRSTNAME = firstName, LASTNAME = lastName, EXPERIENCE = experience, SALARY = salary, ID = id };
            con.Execute("insert into Employee (ID,FirstName,LastName,Experience,Salary) "  
                "Values (@ID ,@FIRSTNAME, @LASTNAME, @EXPERIENCE,@SALARY)", parameters);
        }
    }

    public List<dynamic> SelectAllEmployees()
    {
        using (var con = SqLiteBaseRepository.SimpleDbConnection())
        {
            return con.Query<dynamic>("SELECT * FROM Employee").ToList();
        }
    }

public partial class MainWindow : Window
{
    private EmployeeViewModel _employeeViewModel;

    public MainWindow()
    {
        InitializeComponent();
        string mode = "SQLite";
        _employeeViewModel = new EmployeeViewModel(DataAccessFactory.GetDataAccessObject(mode));
        List<Employee> employees = _employeeViewModel.GetAllEmployees();
        this.DataContext = employees;
        this.Show();
    }

    private void btnSave_Click(object sender, RoutedEventArgs e)
    {
        int id = int.Parse(txtId.Text);
        string firstName = txtFirstName.Text;
        string lastName = txtLastName.Text;
        int experience = int.Parse(txtExperience.Text);
        int salary = int.Parse(txtSalary.Text);
        _employeeViewModel.CreateEmployee(id, firstName,lastName,experience,salary);
        this.DataContext = _employeeViewModel.GetAllEmployees();
    }
}

<Window x:Class="Employee_List_SQLite_Dapper_Wpf.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Employee_List_SQLite_Dapper_Wpf"
    mc:Ignorable="d"
    Title="" Height="450" Width="800">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="auto"></ColumnDefinition>
        <ColumnDefinition Width="200"></ColumnDefinition>
        <ColumnDefinition Width="200"></ColumnDefinition>
        <ColumnDefinition Width="200"></ColumnDefinition>
        <ColumnDefinition Width="35"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <Label FontSize="20" Grid.Row="0" Grid.Column="0">Employee</Label>
    <Label Grid.Row="1" Grid.Column="0">ID:</Label>
    <Label Grid.Row="2" Grid.Column="0">First Name:</Label>
    <Label Grid.Row="3" Grid.Column="0">Last Name:</Label>
    <Label Grid.Row="4" Grid.Column="0">Experience:</Label>
    <Label Grid.Row="5" Grid.Column="0">Salary:</Label>
    <TextBox x:Name="txtId" Grid.Row="1" Grid.Column="1" Margin="2"></TextBox>
    <TextBox x:Name="txtFirstName" Grid.Row="2" Grid.Column="1" Margin="2"></TextBox>
    <TextBox x:Name="txtLastName" Grid.Row="3" Grid.Column="1" Margin="2"></TextBox>
    <TextBox x:Name="txtExperience" Grid.Row="4" Grid.Column="1" Margin="2"></TextBox>
    <TextBox x:Name="txtSalary" Grid.Row="5" Grid.Column="1" Margin="2"></TextBox>
    <Button Name="btnSave" Grid.Row="5" Grid.Column="2" Width="80" Click="btnSave_Click">Save</Button>
    <ListView Grid.Row="6" Grid.ColumnSpan="5" ItemsSource="{Binding Employee}" Margin="5,20,20,20">
        <ListView.View>
            <GridView x:Name="gridEmployee">
                <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" Width="30"/>
                <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" Width="200" />
                <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}" Width="200"/>
                <GridViewColumn Header="Experience" DisplayMemberBinding="{Binding Experience}" Width="100"/>
                <GridViewColumn Header="Salary" DisplayMemberBinding="{Binding Salary}" Width="150"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
  

Ответ №1:

Вот как должен выглядеть ваш код Dapper для получения всех сотрудников:

 var employees = connection.GetAll<Employee>();
  

Вот и все. Вы можете узнать больше об этом GetAll<T>() методе здесь .

Ваш код Insert Employee выглядит нормально, но все, что вам действительно нужно сделать, это:

 var employee = new Employee
{
    FirstName = firstName,
    LastName = lastName,   // etc.
}

connection.Insert(employee);
  

Вам нужно будет правильно аннотировать свой Employee класс, чтобы это работало правильно. Dapper.Contrib Страница, на которую я ссылался выше, объясняет, как это сделать.

Для MVVM я предлагаю хороший учебник, подобный этому.