在ASP.NET中继器中将重复数据与来自访问数据库的数据合并



我试图在中继器中合并数据,以便所有具有相同"项目名称"的配置文件和时间都列在项目下。目前,数据显示为:

9:30项目名称

配置文件1

9:30项目名称

配置文件2

,但我的目的是显示数据为:

9:30项目名称

配置文件1

配置文件2

链接到HTML当前如何布置

aspx文件:

<asp:Repeater ID="rptAgenda" runat="server">
    <ItemTemplate>
        <div class="agenda_card"/>
        <div class="time"><%#Eval("valuefield")%></div>
        <div class="title"><%#Eval("Product")%></div>
        <%#Eval("details")%>
        <a href="#" class="profile_outer">
        <div style="background-image:url('<%#"/photo/" + Eval("photo").ToString()%>');" ></div>
        <%# Eval("type") %></br><b><%#Eval("Name")%>&nbsp;<%#Eval("lastname")%>,&nbsp;<%#Eval("jobtitle")%>
        ><%#Eval("subcompany")%>,&nbsp;<%#Eval("country")%>
        </div>
    </ItemTemplate>
    </asp:Repeater>

c#文件:

public partial class agenda_code : System.Web.UI.Page
{
  OleDbCommand cmd;
  OleDbConnection con;
  protected void Page_Load(object sender, EventArgs e)
  {
      string dbPath = Server.MapPath("~") + "\Database\maindb.accdb";
      con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dbPath + ";Persist Security Info=False;");
      fillAgenda();
  }
  private void fillAgenda()
  {
      string query = "Select listRecipients.valuefield, listRecipients.Product, listRecipients.type, listRecipients.details, Subscribers.Name, Subscribers.lastname, Subscribers.jobtitle, Subscribers.subcompany, Subscribers.country, Subscribers.photo, Subscribers.ContactBio FROM listRecipients ";
      query += "LEFT JOIN Subscribers ON listRecipients.idEmail=Subscribers.idEmail ";
      query += "Where idList=2830 AND (type <> 'Delegate' AND type <>'Sponsor') order by valuefield";
      OleDbDataAdapter adp = new OleDbDataAdapter(query, con);
      System.Data.DataSet ds = new System.Data.DataSet();
      adp.Fill(ds);
      rptAgenda.DataSource = ds;
      rptAgenda.DataBind();
  }
}

希望我不会太模糊,但是任何回应都将不胜感激:(

我将在以下完成。

  1. 创建模型
  2. 致电数据库,返回IEnumerable<Model>
  3. 然后我将过滤数据收集
  4. 将过滤的内容物绑定到中继器

本质上,您将有一个简单的对象,未过滤结果集将返回。然后使用linq对您想实现的任何东西进行消毒,分组或任何您想实现的目标。

var collection = dbContext.GetSample();
var filter = collection.Where(sample => sample.Item == "Data");
rptSample.DataSource = filter;
rptSample.Bind();

您需要使用适当的LINQ查询来达到数据结果。但是,您可以通过数据库中的更好数据集来实现此目标。然后,您可以简单地绑定,但是如果没有对数据的结构或理解,那将是我推荐的两种方法。

更新:

您将创建一个与您的业务逻辑有关的对象。

public class Product
{
     public int Id { get; set; }
     public string Name { get; set; }
     public string Description { get; set; }
}

因此,您将从数据库中提取模型。我已经抽象了这一点,以反映数据库调用。但这就是所有逻辑正在做的。

public IEnumerable<Product> GetAllProducts()
{
     using(var context = factory.Create())
          yield return context.RetrieveAllProducts();
}

因此,我们在类中有一种方法来检索我们的产品。在页面加载中,您将执行以下操作:

var products = productService.GetAllProducts().Where(product => product.Name.Contains("box"));

请注意,包含不理想的情况并不理想,但这是一个例子。因此,我已经打电话给我们所有的产品,只想要包含框的名称的产品。所以,现在我将这些控制权。

rptProducts.DataSource = products;
rptProducts.DataBind();

因此,模型代表我们的对象,我们使用控件将所需的内容反映给我们的页面。这有一些好处,主要是您有一个模型来反映您的业务逻辑。您还会收到能够将对象拉一次,然后缓存,然后在其他地方使用的好处。存在缺点,但是您经常可以克服,只需要找到适合您应用的适当用法即可。

最新更新