gustavnavar / Grid.Blazor

Grid component with CRUD for Blazor (client-side and server-side) and ASP.NET Core MVC
GNU Lesser General Public License v2.1
696 stars 134 forks source link

how to return additional data from controller using odata backend #389

Closed ChhaganSinha closed 10 months ago

ChhaganSinha commented 1 year ago

Hi.. I want to return some data it may be some calculated data from controller like this

 public class CampaignlogController : ODataController
    {
        public ILogger<CampaignlogController> Logger { get; }
        public TenantDbContext DbContext { get; }
        public CampaignlogController(ILogger<CampaignlogController> logger, ITenantDbResolver tenantDbResolver)
        {
            Logger = logger;
            DbContext = tenantDbResolver.TenantDbCtx;
        }

        [EnableQuery]
        public IQueryable<object> Get()
        {
            var campaignLogs = DbContext.CampaignLogs.AsQueryable();

            var campaignLogsWithInfo = campaignLogs.Select(log => new
            {
                CampaignLog = log,
                HitCount = CampaignLog.Count(o=>o.IsHit == true);
            });

            return campaignLogsWithInfo;
        }

        // [EnableQuery]
        //public IQueryable<CampaignLog> Get()
        //{
        //    var a =  DbContext.CampaignLogs.AsQueryable();
        //    return ;
        //}
    }

here is CampaignLogWithInfoDto class

 public class CampaignLogWithInfoDto
    {
        public CampaignLog CampaignLog { get; set; }
        public int  HitCount { get; set; }
    }

and i was trying to get this return data in page like


@if (_task.IsCompleted)
{
    <div class="row">
        <div class="col-sm-12">
            <GridComponent T="object" Grid="@_grid"></GridComponent>
        </div>
    </div>
}
else
{
    <div class="col-sm-12" style="margin-top:5vh">

        <div class="card-header">
            <div class="loading-bar"></div>
        </div>

    </div>
}

@code {

    private CGrid<object> _grid;
    private Task _task;

    Action<IGridColumnCollection<object>> columns = c =>
     {
     c.Add(o => ((CampaignLog)o).Id).Titled("LogID").SetWidth("30px").Css("table-bordered");
     c.Add(o => ((CampaignLog)o).Camp.Id).Titled("CampID").SetWidth("30px").Css("table-bordered");
     c.Add(o => ((CampaignLog)o).Camp.Name).Css("table-bordered").Titled("Campaign Name"); ;
     c.Add(o => ((CampaignLog)o).CampignType).Css("table-bordered").SetWidth("60px");
     c.Add(o => ((CampaignLog)o).Camp.Category).Css("table-bordered").SetWidth("60px").Titled("Category");
     c.Add(o => ((CampaignLog)o).IsHit).Css("table-bordered");
     c.Add(o => ((CampaignLog)o).IsReported).Css("table-bordered");
     c.Add(o => ((CampaignLog)o).CreatedOn).Css("table-bordered");
     };

    protected override async Task OnParametersSetAsync()
    {
        string url = $"Odata/Campaignlog?t={authState.TenantIdentifier}";
        var query = new QueryDictionary<StringValues>();

            var client = new GridODataClient<object>(HttpClient, url, query, false, "ordersGrid", columns, 50)
             .ChangePageSize(true)
             .Filterable()
             .ClearFiltersButton(true)
             .SetStriped(true)
             .WithGridItemsCount()
             .Searchable(true, false, false);

            _grid = client.Grid;
            _task = client.UpdateGrid();
            await _task;

            var campaignLogs = _grid.Items.Select(item =>
            {
                var campaignLogs = _grid.Items.Select(item =>
            {
                var campaignLog = ((JObject)item).ToObject<CampaignLog>();
                var HitCounts = ((JObject)item).ToObject<CampaignLogWithInfoDto>().HitCount;
                return new
                {
                    CampaignLog = campaignLog,
                };

            }).ToList();
    }
}

in above solution controller hitting and returning data but I am getting _grid items=0. can you please suggest possible solution to achieve this....

gustavnavar commented 1 year ago

I think you should use CampaignLogWithInfoDto object for OData controller and EdmModel instead of using CampaignLog.

This would imply to also use CampaignLogWithInfoDto as grid object.