0

これまで、私が構築した Web アプリのほとんどは背後に Oracle データベースを持っているため、データを取得または更新するときは、検索変数をクラスに渡して SQL を構築し、接続を開き、DataTable を作成してフォームに戻します。次に、グリッドビューにバインドします-簡単なことです。

現在、SQL Server データベースに Linq を使用しています。これを簡単に構築して、button_click イベント (以下のコード) で動作させることができますが、変数を別のクラスに渡してコード ビハインドから実行しないようにする場合、正確には何を返しますか?フォームに戻る?

それが理にかなっていることを願っています-私は基本的に以下のことをしたいと思っていますが、コードビハインドではありません。

ASB_DataDataContext adb = new ASB_DataDataContext();
var qryAdb = from asb in adb.Inputts
             select new
             {
                 NRTno = asb.NRT_No,
                 PerpSurname = asb.Allg_Perp_Surname,
                 PerpSteet = asb.Allg_Perp_Street,
                 HouseNo = asb.Allg_Perp_House_No,
                 Complainer = asb.Complainant_Surname,
                 Complainer_Street = asb.Complainant_Street
             };

if (txtCompSurname.Text != "")
    qryAdb = qryAdb.Where(asb => asb.Complainer == txtCompSurname.Text);
if (txtCompStreet.Text != "")
    qryAdb = qryAdb.Where(asb => asb.Complainer_Street == txtCompStreet.Text);
if (txtPerpSurname.Text != "")
    qryAdb = qryAdb.Where(asb => asb.PerpSurname == txtPerpSurname.Text);
if (txtPerpStreet.Text != "")
    qryAdb = qryAdb.Where(asb => asb.PerpSteet == txtPerpStreet.Text);
if (txtNrtNo.Text != "")
    qryAdb = qryAdb.Where(asb => asb.NRTno == Convert.ToInt32(txtNrtNo.Text));


gvResults.DataSource = qryAdb.Select(o => new { o.NRTno, o.PerpSurname, o.PerpSteet, o.HouseNo, o.Complainer, o.Complainer_Street });
gvResults.DataBind(); 
4

3 に答える 3

2

その「他のクラス」から匿名型を返すことはできないため、単一の戻り値に対して「実際の」クラスを作成する必要があります。次に、メソッドから を返すことができIEnumerable<ReturnClass>ます。

その後、その戻り値に対してバインドできます。

于 2012-06-22T09:27:20.390 に答える
2

返されるものが何であれ、POCO クラスを作成します。

public class Person
{
    public NRTNo string {get; set;}
    ....
}

LINQ でこのクラスを選択します (select new の後の Person クラス名に注意してください)。

var qryAdb = (from asb in adb.Inputts
                          select new Person
                          {
                              NRTno = asb.NRT_No,
                              PerpSurname = asb.Allg_Perp_Surname,
                              PerpSteet = asb.Allg_Perp_Street,
                              HouseNo = asb.Allg_Perp_House_No,
                              Complainer = asb.Complainant_Surname,
                              Complainer_Street = asb.Complainant_Street
                          });

クエリで既に行っていることを実行します。

            if (txtCompSurname.Text != "")
                qryAdb = qryAdb.Where(asb => asb.Complainer == txtCompSurname.Text);
            if (txtCompStreet.Text != "")
                qryAdb = qryAdb.Where(asb => asb.Complainer_Street == txtCompStreet.Text);
            if (txtPerpSurname.Text != "")
                qryAdb = qryAdb.Where(asb => asb.PerpSurname == txtPerpSurname.Text);
            if (txtPerpStreet.Text != "")
                qryAdb = qryAdb.Where(asb => asb.PerpSteet == txtPerpStreet.Text);
            if (txtNrtNo.Text != "")
                qryAdb = qryAdb.Where(asb => asb.NRTno == Convert.ToInt32(txtNrtNo.Text));

POCO オブジェクトのリストを返します。

return qryAdb.ToList<Person>();

現在バインドしているのと同じ方法で、UI でこれにバインドできるようになりました。

于 2012-06-22T09:38:57.543 に答える
0

これは可能性です: ユーザー入力に Web フォームを使用します。クエリをクラス (フォームの背後にあるコードではない) に送信し、慣れているように sql を記述します。(no-oracle 構文のみ) オブジェクトに解析し、オブジェクトのListコレクションを返します。データテーブルを返し、それをグリッドビューにバインドすることもできます。それが少し役立つことを願っています。

WebForms1.aspx:

<asp:TextBox runat="server" ID="tb"></asp:TextBox>
<asp:Button runat="server" ID="btn" Text="go" OnClick="btn_OnClick"/><br/>
<asp:GridView runat="server" ID="gv"></asp:GridView>

WebForm1.aspx.cs:

protected void btn_OnClick(object sender, EventArgs e)
{
    if(!String.IsNullOrWhiteSpace(tb.Text))
    {
        Class1 cl = new Class1();
        List<Complainer> complainers = cl.SearchBySurname(tb.Text);
        gv.DataSource = complainers;
        gv.DataBind();
    }
}

Class1.cs:

public class Class1
{
    internal List<Complainer> SearchBySurname(string p)
    {
        SqlCommand com = new SqlCommand("select * from Complainers where surname = @sur ");
        com.Parameters.AddWithValue("sur", p);
        List<Complainer> complainers = new List<Complainer>();
        using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["yourconstring"].ToString()))
        {
            con.Open();
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(com);
            da.Fill(dt);

            foreach(DataRow dr in dt.Rows)
            {
                Complainer c = new Complainer(dr);
                complainers.Add(c);
            }
        }
        return complainers;
    }
}

Complainer.cs:

public class Complainer
{
    private int _id;

    public Complainer(System.Data.DataRow dr)
    {
        // TODO: Complete member initialization
        _id = Convert.ToInt32(dr["id"]);
    }
}

サンプル プロジェクトを編集してドロップボックスに置きます: https://www.dropbox.com/s/l7clhlvgdk2gul3/WebApplication2.zip

于 2012-06-22T09:43:24.603 に答える