0

到目前为止,我构建的大多数 Web 应用程序背后都有一个 Oracle 数据库,因此在获取或更新数据时,我会将搜索变量传递给一个类以构建 SQL,打开一个连接并创建一个 DataTable 以传递回表单然后我绑定到一个gridview - 简单的东西。

我现在将 Linq 用于 SQL Server 数据库。我可以轻松地构建它并让它在 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 中选择进入此类(请注意选择新后的 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 中以与当前绑定相同的方式绑定到 this。

于 2012-06-22T09:38:57.543 回答
0

这是一种可能性:使用网络表单进行用户输入。将查询发送到一个类(不是表单后面的代码),仍然像以前一样编写 sql。(仅无 oracle 语法)并将其解析为对象并返回对象的List集合。您还可以返回一个数据表并将其绑定到gridview。希望它有点帮助。

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;
    }
}

投诉者.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 回答