2012-06-22 6 views
0

До сих пор большинство веб-приложений, построенных Ive, располагали базой данных Oracle, поэтому при извлечении или обновлении данных Id передают переменные поиска в класс для построения SQL, открывают соединение и создайте DataTable, чтобы передать форму, которую я затем привязываю к gridview - легкий материал.Использование LINQ to SQL в ASP.NET

Теперь я использую 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(); 
+0

не в коде позади? так как параметры хранимой процедуры? Кстати, вы не привязаны к Linq2SQL. Вы все равно можете использовать 'SqlCommand' и использовать объекты DataTable для привязки к gridviews и т. Д. –

ответ

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

Do что вы уже делаете с запросом:

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

Теперь вы можете связаться с этим в своем интерфейсе так же, как и в настоящий момент.

+1

Ahhh ... попробовал это раньше - все, чего мне не хватало, было .ToList <> - Большое спасибо! – DarkW1nter

+0

Все работает отлично сейчас - снова спасибо – DarkW1nter

+0

Добро пожаловать. – Carl

2

Вы не можете вернуть анонимного типа из этого «другого класса», так что вам нужно, чтобы создать «реальный» класс для одного возвращаемого значения. Затем вы можете вернуть IEnumerable<ReturnClass> из вашего метода.

Затем вы можете привязать это возвращаемое значение.

+0

Вы _can_ возвращаете анонимный тип и используете его для привязки сетки так же, как и к не анонимным типам.Однако я бы рекомендовал создать настоящий DTO. – Magnus

0

Это возможность: использовать веб-форму для входа пользователя. отправьте запрос в класс (а не код позади формы) и все еще напишите sql, как вы привыкли. (только синтаксис без оракула) и разобрать его на объекты и вернуть коллекцию объекта List. вы также можете вернуть datatable и привязать его к 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; 
    } 
} 

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

+0

спасибо за это тоже - собираюсь дать этому идти – DarkW1nter