Платформа сущностей LINQ — ПОДСЧЕТ И ЗАПРОС

#linq #entity-framework #linq-to-sql #linq-to-entities #linq-to-objects

#linq #структура сущностей #linq-to-sql #linq-to-entities #linq-to-objects

Вопрос:

 edmx file: OrderData:
ORDERID
SHIPMENT
DRIVER_ID
RECEIVE_NAME
  

нам нужно создать таблицу и распечатать для каждого DRIVER_ID
первый столбец: DRIVER_ID
второй столбец: сколько строк с этим идентификатором ДРАЙВЕРА
третий столбец: сколько строк с этим идентификатором DRIVER_ID и имеет RECEIVE_NAME не null

пожалуйста, покажите мне, как это можно сделать … мне удалось напечатать только 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:

Отредактировал ответ в соответствии с комментариями.
Я бы определил класс для включения результатов вашего запроса в первую очередь:

 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. В вашем случае кажется, что вы хотите отображать только данные, поэтому более простой элемент управления (такой как повторитель) может оказаться более подходящим.

Комментарии:

1. можете ли вы не использовать функцию getsomeresults и показать мне, как вы используете приведенный выше код без использования GetSomeResults … можете ли вы создать функцию «count_drivers_orders», код, который я вставил, был просто для примера… на этот раз я вставлю весь код, который у меня есть, в файл server.cs

2. Ваш код использует мою функцию GetSomeResults на стороне сервера … я ищу способ заменить эту функцию и получить только эту таблицу

3. ваш код выдал мне ошибку: «Ошибка 4 Имя ‘GetSomeResults’ не существует в текущем контексте

4. IQueryable<OrderView> results= rep.GetSomeResults(); обратите внимание, что эта строка отсутствовала в вашем коде

5. Хорошо, я предпринял еще одну попытку помочь вам заставить код работать. Вы можете попробовать и посмотреть, поможет ли это.