调整实体(自定义列)

本文关键字:自定义 实体 调整 | 更新日期: 2023-09-27 18:33:08

我的客户一直在使用 ADO.NET,现在想要迁移到 EF。 我开始怀疑他的约束是否会阻止它。 (尽管可能是我对 EF 的相对陌生阻止了它。

以下是约束条件:

  1. 我可能不会更改数据库。
  2. 不能更改太多代码(只替换数据层(这里的大事是,他几乎所有的表单都有一个自动生成列的数据网格(你会在小样本中明白我的意思(
  3. (其他人我可能忘记了(

他使用 SQL 来更改列名。 没问题,我想,我会用投影来做同样的事情。 我写了一个微不足道的例子来说明正在发生的事情。

  SqlConnection MyConnection = new SqlConnection(Properties.Settings.Default.TestConnectionString);
        MyConnection.Open();
        string SQLString = "Select fName as '"First Name'", lName as '"Sur Name'", lName as '"Last Name'", Age from Test";

        SqlDataAdapter MyAdapter = new SqlDataAdapter(SQLString, MyConnection);
        DataSet MySet = new DataSet("table");
        MyAdapter.Fill(MySet);
        bindingSource1.DataSource = MySet.Tables[0];
        dataGridView1.AutoGenerateColumns = true;
        bindingSource1.ResetBindings(true);

这是我的代码

var MyContext = new TestEntities();
var MyQuery = MyContext.Tests.Select(
               test => new 
                       { 
                           FirstName = test.fName, 
                           SurName = test.lName, 
                           LastName = test.lName, 
                           Age = test.Age 
                        });
bindingSource2.DataSource = MyQuery.ToList();
dataGridView2.AutoGenerateColumns = true;
bindingSource2.ResetBindings(true);

目前为止,一切都好。 不是他所做的事情的精确复制(我的列中没有空格(,但他对此很好。

但随后,他根据双击数据网格做出决策。 所以他想做这样的事情。

 private void dataGridView2_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            Test MyTest = bindingSource2.Current as Test;
            if (MyTest.Age > 50)
                MessageBox.Show("You are old!");
        }

投影创建匿名类型,所以我不能在这里做出这种决定。 (请注意,我必须更改代码才能执行此操作 - 他当前的代码根据 datagrid 行中的数据做出选择,但他现在相信我们需要使用类

有没有办法用实体做到这一点?

调整实体(自定义列)

投影不会只创建匿名类型。您可以声明新类:

public class TestViewClass
{
     public string FirstName {get;set;}
     public string SurName {get;set;}
     public string LastName {get;set;}
     public int Age {get;set;}
}

并制作这样的方法:

IQueryable<TestViewClass> GetView()
{
    return MyContext.Tests.Select(t => new TestViewClass
    {
                       FirstName = t.fName, 
                       SurName = t.lName, 
                       LastName = t.lName, 
                       Age = t.Age 
    }; 
}

现在你可以像这样获取TestViewClass对象:

TestViewClass testView = GetView().Where(t => t.Age > 50).FirstOrDefault();