塑造实体(自定义列)

时间:2012-05-04 18:22:29

标签: c# entity-framework

我的客户一直在使用ADO.NET,现在想转移到EF。我开始怀疑他的约束是否会阻止它。 (尽管我对EF的相对新颖性可能会阻止它。)

以下是限制因素:

  1. 我可能不会更改数据库。
  2. 我不能改变太多的代码(只替换数据层)这里最重要的是,几乎所有的表单都有一个自动生成列的数据网格(你会在小样本中看到我的意思)< / LI>
  3. (其他我可能忘了)
  4. 他使用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行中的数据进行选择,但现在他的销售理由是我们需要使用类。)

    有没有办法用Entity做到这一点?

1 个答案:

答案 0 :(得分:1)

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

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();