0

私の顧客は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行のデータに基づいて選択しますが、クラスを使用する必要があるという考えで販売されています。)

エンティティでこれを行う方法はありますか?

4

1 に答える 1

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();
于 2012-05-05T14:48:57.267 に答える