LINQ实体框架 - COUNT和QUERY

时间:2011-11-04 20:10:45

标签: linq entity-framework linq-to-sql linq-to-entities linq-to-objects

edmx file: OrderData:
ORDERID
SHIPMENT
DRIVER_ID
RECEIVE_NAME

我们需要为每个DRIVER_ID构建一个表并打印 第一列:DRIVER_ID 第二列:使用此DRIVER_ID的行数 第三列:具有此DRIVER_ID的行数和RECEIVE_NAME不为空

请告诉我怎么做...我只设法打印一个getquery :(

    SERVER.CS

    public class OrderDataRepository : BaseRepository<OrderData>
    {


        public class OrderDataResults
        {
            public long DriverId { get; set; }
            public int OrderCount { get; set; }
            public int OrderCountWhereNameIsNotNull { get; set; }
        }




        public class OrderViewRepository : BaseRepository<OrderData>
        {
            public List<OrderDataResults> GetOrderDataResults()
            {
                return GetQuery().
                       Where(x => x.SHIPMENT != null).
                       GroupBy(o => o.DRIVER_ID).
                       Select(g =>
                                 new OrderDataResults
                                 {
                                     DriverId = g.Key,
                                     OrderCount = g.Count(),
                                     OrderCountWhereNameIsNotNull =
                                                       g.Count(o => o.RECEIVE_NAME != null)
                                 }).ToList();
            }
        }







    CLIENT.ASPX.CS

    public partial class Control : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {

            var rep = new OrderViewRepository();
            List<OrderDataResults> results = GetOrderDataResults();

**Error 12  The name 'GetOrderDataResults' does not exist in the current context
Error   11  The type or namespace name 'OrderDataResults' could not be found (are you missing a using directive or an assembly reference?)
**
            DataViewer.DataSource = results;
            DataViewer.DataBind();

        }


    }


    WEBPAGE.ASPX
<form id="Form1" runat="server">
        <asp:GridView runat="server" ID="DataViewer">
        </asp:GridView>
    </form>

1 个答案:

答案 0 :(得分:2)

根据评论编辑答案 我会定义一个类来首先合并你的查询结果:

public class OrderDataResults // Or whatever you want to call it
{
    public int DriverId { get; set; }
    public int OrderCount { get; set; }
    public int OrderCountWhereNameIsNotNull { get; set; }
}

从您的服务器,您可以返回以下列表:

public class OrderViewRepository : BaseRepository<OrderView>
{
    public List<OrderDataResults> GetOrderDataResults()
    {
        return GetQuery().
               Where(x => x.SHIPMENT != null).
               GroupBy(o => o.DRIVER_ID).
               Select(g =>
                         new OrderDataResults
                         {
                             DriverId = g.Key,
                             OrderCount = g.Count(),
                             OrderCountWhereNameIsNotNull = 
                                               g.Count(o => o.RECEIVE_NAME != null)
                         }).ToList();
    }
}

加载页面时,您可以调用GetOrderDataResults()方法并获取列表:

protected void Page_Load(object sender, EventArgs e)
{
    var rep = new OrderViewRepository();
    List<OrderDataResults> results = rep.GetOrderDataResults();

    DataViewer.DataSource = results;
    DataViewer.DataBind();
}

要查看结果,只需从<Columns>定义中删除GridView部分:

<asp:GridView runat="server" ID="DataViewer">
</asp:GridView>

同样,您可能希望重构此代码并在您使用此代码后立即自行做出一些结构性决策(例如,决定是否要从您的代理中返回列表等)。
此外,您可能希望自定义表的外观,因此您可能需要查看GridView文档。在您的情况下,似乎您只想显示数据,因此更简单的控件(例如Repeater)可能更适合。