【问题标题】:Using LINQ to SQL in ASP.NET在 ASP.NET 中使用 LINQ to SQL
【发布时间】:2012-06-22 09:21:07
【问题描述】:

到目前为止,我构建的大多数 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(); 

【问题讨论】:

  • 不在代码后面?那么作为存储过程的参数?顺便说一句,您没有绑定到 Linq2SQL。您仍然可以使用SqlCommand 并使用DataTableobjects 绑定到gridviews 等。

标签: c# asp.net .net linq linq-to-sql


【解决方案1】:

为您返回的任何内容创建一个 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。

【讨论】:

  • 啊...之前尝试过 - 我所缺少的只是 .ToList - 非常感谢!
【解决方案2】:

您不能从该“其他类”返回匿名类型,因此您需要为单个返回值创建一个“真实”类。然后你可以从你的方法中返回一个IEnumerable&lt;ReturnClass&gt;

然后您可以绑定该返回值。

【讨论】:

  • 可以返回一个匿名类型并将其用于绑定网格,就像使用非匿名类型一样。但是,我建议创建一个真正的 DTO。
【解决方案3】:

这是一种可能性:使用网络表单进行用户输入。将查询发送到一个类(不是表单后面的代码),并且仍然像以前一样编写 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"]);
    }
}

编辑 将示例项目放到 Dropbox:https://www.dropbox.com/s/l7clhlvgdk2gul3/WebApplication2.zip

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2011-04-17
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多