如何使用实体数据源显示来自两个表的数据?

时间:2012-08-18 13:06:43

标签: c# asp.net sql-server entity-framework

我正在为销售电话号码的公司创建购物车。要购买电话号码,“客户”需要通过各种步骤配置他们的电话号码。

  • 第一步:选择一个电话号码
  • 第二步:将呼叫包添加到此号码
  • 第三步:添加其他功能,例如语音邮件等......
  • 第四步:审核订单&结帐

到目前为止,我的方法是一个向导式流程,我将Customers选项存储在名为NumberCart的数据库中的表中。这将存储第一步和第二步的所有信息。

第三步有点棘手,因为客户可以拥有与所选号码相关的多个选项。为了尝试解决这个问题,我决定将他们的功能选择存储在一个名为FeatureCart的单独表中。

我一直在利用Entity Framework来检索和插入数据。可以通过剪切和粘贴此链接来调整数据模型(因为我是新手,Stackoverflow只允许我发布两个链接)。

[armourcreative.co.uk/EntityDesignerDiagram.bmp]

我的问题是,有没有办法检索这两个表并在网页中呈现结果,以便它显示为下面链接上的图像?

Example Cart Render of exactly what I want to achieve

我可以得到的是两个EntityDataSources连接到同一页面上的NumberFeatureView和NumberPackageView,它们呈现如下链接中的图像:

Example Cart Render of not what I'm looking for

您可以看到不是一种非常清晰的方式来显示用户选择,因为它不会将该功能与其所属的电话号码相关联。

我的想法是以某种方式显示基于CartID和NumberID匹配NumberPackageView的NumberFeatureView。

如果有人能告诉我如何完成上述工作,我将非常感激。我可能会偏离标志,这就是为什么我迫切需要帮助和指导。

REVISION

好的,我已设法使用以下代码让他正确渲染:

    <h3>Please review your order!</h3>
<asp:ListView ID="NumberPackageView_LV" runat="server" 
    DataSourceID="NumberPackageView_EDM">

    <EmptyDataTemplate>
        No data was returned.
    </EmptyDataTemplate>


    <ItemTemplate>
        <li style="">
            <asp:HiddenField ID="ID" runat="server" Value='<%# Eval("NumberID") %>' />
            <strong><asp:Label ID="NumberLabel" runat="server" Text='<%# Eval("Number") %>' /></strong>&nbsp;&nbsp;&rarr;&nbsp;&nbsp;
            <asp:Label ID="DestinationLabel" runat="server" Text='<%# Eval("Destination") %>' />
            <br />
            <asp:Label ID="PkgNameLabel" runat="server" Text='<%# Eval("PkgName") %>' />&nbsp;&nbsp;&nbsp;&nbsp;
            <asp:Label ID="PkgMonthlyLabel" runat="server" Text='<%# string.Format("{0:c}",(Eval("PkgMonthly"))) %>' />


            <!-- ENTITY DATA SOURCE FOR FEATURES -->

<asp:ListView ID="NumberFeatureView_LV" runat="server" 
    DataSourceID="NumberFeatureView_EDM">
    <EmptyDataTemplate>
        No data was returned.
    </EmptyDataTemplate>
    <ItemTemplate>
        <li style="">
            <asp:Label ID="FeatureNameLabel" runat="server" Text='<%# Eval("FeatureName") %>' />
            <asp:Label ID="FeatureSetUpLabel" runat="server" Text='<%# string.Format("{0:c}", (Eval("FeatureSetUp"))) %>' />
            <asp:Label ID="FeatureMonthlyLabel" runat="server" Text='<%# string.Format("{0:c}", (Eval("FeatureMonthly"))) %>' />
        </li>
    </ItemTemplate>
    <LayoutTemplate>
        <ul ID="itemPlaceholderContainer" runat="server" style="">
            <li runat="server" id="itemPlaceholder" />
        </ul>
    </LayoutTemplate>
</asp:ListView>



<asp:EntityDataSource ID="NumberFeatureView_EDM" runat="server" 
    AutoGenerateWhereClause="True" ConnectionString="name=ShoppingCartv2Entities" 
    DefaultContainerName="ShoppingCartv2Entities" EnableFlattening="False" 
    EntitySetName="NumberFeatureViews" 
    Select="it.[FeatureName], it.[FeatureSetUp], it.[FeatureMonthly]" Where="">
    <WhereParameters>
        <asp:SessionParameter DefaultValue="0" Name="CartID" SessionField="ShoppingCartv2_CartId" />
    </WhereParameters>
</asp:EntityDataSource>

<!-- ENTITY DATA SOURCE FOR FEATURES [END] -->

 </li>
    </ItemTemplate>
    <LayoutTemplate>
        <ul ID="itemPlaceholderContainer" runat="server" style="">
            <li runat="server" id="itemPlaceholder" />
        </ul>
    </LayoutTemplate>
</asp:ListView>

<asp:EntityDataSource ID="NumberPackageView_EDM" runat="server" 
    AutoGenerateWhereClause="True" ConnectionString="name=ShoppingCartv2Entities" 
    DefaultContainerName="ShoppingCartv2Entities" EnableFlattening="False" 
    EntitySetName="NumberPackageViews" 
    Select="it.[NumberID], it.[Number], it.[Destination], it.[PkgName], it.[PkgMonthly]" Where="">
    <WhereParameters>
        <asp:SessionParameter DefaultValue="0" Name="CartID" SessionField="ShoppingCartv2_CartId" />
    </WhereParameters>
</asp:EntityDataSource>

我现在唯一的问题是,由于结果是在会话购物车上过滤的,因此它会重复存储在每个号码下的FeatureCart中的所有功能,而不是显示针对该特定号码选择的功能。 (仅当客户在购物车中添加了多个电话号码时才会发生这种情况)

示例:

0800 123 0001

  • 功能语音信箱
  • 功能通话记录
  • Feature Ring Group

0800 123 0002

  • 功能语音信箱
  • 功能通话记录
  • Feature Ring Group

INSTEAD OF

0800 123 0001

  • Feature Ring Group

0800 123 0002

  • 功能语音信箱
  • 功能通话记录

任何人都可以告诉我如何仅显示针对相关数字选择的功能而不是每个数字的相同选择(如果这有意义吗?)

1 个答案:

答案 0 :(得分:0)

您可能想要尝试的一个选项是创建一个List并存储该列表中两个表的行,然后将列表绑定到网格。例如:

public class Main
{

    public void BindData()
    {
        List<MyList> myResults = new List<MyList>();

        //Add rows from numbercart to list object
        foreach (var item in NumberCart)
        {
            myResults.Add(new MyList { Item = item.item, Price = item.price });
        }

        //Add rows from feature cart to list object
        foreach (var item in FeatureCart)
        {
            myResults.Add(new MyList { Item = item.item, Price = item.price });
        }

        //Bind to datagrid
        myDataGrid.DataSource = myResults;

    }
}



public class MyList
{
    public string Item {get; set;}
    public float Price {get; set;}
}