RadGrid.GetBindingData and Entity Framework

30 posts, 1 answers
  1. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 10 Oct 2012 Link to this post

    Hello everyone,

    I've been researching on how to bind an Object Data Source to a RadGrid, implementing sorting, filtering and paging.

    So I did the following

    OdsProducts (Object DataSource):
    using System.Collections.Generic;
    using System.Linq;
    using SetupSvc;
     
     
    /// <summary>
    /// Summary description for DataSources
    /// </summary>
    public class OdsProducts
    {
        int _count;
     
        public List<Product> SelectProducts(string filterExpression, string sortExpression, int clientId, int maximumRows, int startRowIndex)
        {
            //Call to a WCF service
            using (SetupSvcClient client = new SetupSvcClient())
            {
                List<Product> products = client.GetProductGrid(clientId, startRowIndex, maximumRows, sortExpression, filterExpression).ToList();// client.GetProductListByClientId(1).ToList();
                return products;
            }
        }
     
        public int CountProducts(string filterExpression, string sortExpression, int clientId)
        {
            //Don't worry about this, I know it's not right, but I know how to solve it.
            using (SetupSvcClient client = new SetupSvcClient())
            {
                List<Product> allProducts = client.GetProductListByClientId(1).ToList();
                return allProducts.Count;
            }
        }
    }

    ASPX File:
    <telerik:RadScriptManager ID="sManager" runat="server"></telerik:RadScriptManager>
    <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server">
        <AjaxSettings>
                    
            <telerik:AjaxSetting AjaxControlID="RadGrid1">
                <UpdatedControls>
                    <telerik:AjaxUpdatedControl ControlID="RadGrid1" LoadingPanelID="RadAjaxLoadingPanel1" />
                </UpdatedControls>
            </telerik:AjaxSetting>
        </AjaxSettings>       
    </telerik:RadAjaxManager>
    <telerik:RadAjaxLoadingPanel runat="server" ID="RadAjaxLoadingPanel1" Skin="Default" />
     
    <div class="box">
        <div class="box-head">
            <h3>Prueba grid</h3>
        </div>
        <div class="box-content">
            <telerik:RadGrid ID="RadGrid1" DataSourceID="ObjectDataSource1" AllowFilteringByColumn="true"
                AllowSorting="true" AllowPaging="true" runat="server" EnableLinqExpressions="true">
                <MasterTableView AllowCustomSorting="true" OverrideDataSourceControlSorting="true"></MasterTableView>
            </telerik:RadGrid>
        </div>
    </div>
     
    <asp:ObjectDataSource ID="ObjectDataSource1" TypeName="OdsProducts" EnablePaging="true"
        SelectMethod="SelectProducts" SelectCountMethod="CountProducts" runat="server"
        OnSelecting="ObjectDataSource1_Selecting">
        <SelectParameters>
            <asp:Parameter Name="filterExpression" Type="String" />
            <asp:Parameter Name="sortExpression" Type="String" />
            <asp:Parameter Name="clientId" Type="Int32" DefaultValue="2" />
        </SelectParameters>
    </asp:ObjectDataSource>

    Code Behind File:
    protected void ObjectDataSource1_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
    {
            //e.Arguments.MaximumRows = your value;
            e.InputParameters["filterExpression"] = RadGrid1.MasterTableView.FilterExpression;
            e.InputParameters["sortExpression"] = RadGrid1.MasterTableView.SortExpressions.GetSortString();
            e.InputParameters["clientId"] = this.GetCurrentClientId();
    }

    Use of RadGrid.GetBindingData
    public List<Product> GetProductsGrid()
    {
         return Telerik.Web.UI.RadGrid.GetBindingData(this.GetProductIQueryableList().Where(x => x.ClientId == clientId).OrderBy(y=>y.Id), startRowIndex, maximumRows, sortExpression, filterExpression).Data.ToList<Product>();
    }


    Exception 1
    (See attached file 20121010 947.png)


    How I solved the .ToString() problem
    filterExpression = filterExpression.Replace(".ToString()", string.Empty);
     
    return Telerik.Web.UI.RadGrid.GetBindingData(this.GetProductIQueryableList().Where(x => x.ClientId == clientId).OrderBy(y=>y.Id),
        startRowIndex, maximumRows, sortExpression, filterExpression)
        .Data.ToList<Product>();

    Exception 2
    See attached file 20121010 951.png


    How can I solve the DateTime.Parse?
    Is it possible for you to show us how to use the filterExpression without the RadGrid.GetBindingData?

    In advance, many many thanks :D
  2. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 10 Oct 2012 Link to this post

    I've found System.Linq.Dynamic library and now I can use filterExpression and filterExpression provided by Telerik.

    Now, having Entity framework, how can I make it compatible?
  3. UI for ASP.NET Ajax is Ready for VS 2017
  4. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 12 Oct 2012 Link to this post

    So, I did find this Linq.Dynamic library and it does work with entity framework, you just need to apply the filterExpression in a way this understands.

    I created the following method which makes it work. Anyway, if you can find a better solution, please post it here.

    Method:
    /// <summary>
    /// Convierte un FilterExpression enviado por un RadGrid de Telerik a uno válido para ser utilizado
    /// por Linq.Dynamic + Entity Framework
    /// </summary>
    /// <param name="rawFilterExpression">Filter Expression generado por el RadGrid</param>
    /// <param name="parameters">Parámetros encontrados dentro del filterExpression y que deben ser utilizados por Linq.Dynamic</param>
    /// <returns>Retorna un string válido para ser utilizado por Linq.Dynamic</returns>
    public static string ConvertFilterExpression(string rawFilterExpression, out object[] parameters)
    {
        string filterExpression = rawFilterExpression.Replace(".ToString()", string.Empty);
         
        int count = rawFilterExpression.CountSubStrings("DateTime.Parse");
        parameters = new object[count];
     
        if (count > 0)
        {
            filterExpression = filterExpression.Replace("DateTime.Parse", string.Empty);
     
            for (int i = 0; i < count; i++)
            {
                System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("\\(\"\\d{2}/\\d{2}/\\d{4} \\d{1}:\\d{2}:\\d{2}\"\\)");
     
                string date = regex.Match(filterExpression).ToString();
                filterExpression = regex.Replace(filterExpression, "@" + i.ToString(), 1);
     
                string[] datePart = date.Replace("\"", string.Empty).Replace(" 0:00:00)", string.Empty).Replace("(", string.Empty).Split('/');
                parameters[i] = new DateTime(int.Parse(datePart[2]), int.Parse(datePart[1]), int.Parse(datePart[0]));
            }
        }
        return filterExpression;
    }

    This method uses CountSubString which is defined as follows:
    public static int CountSubStrings(this string testString, string testSubstring)
            {
                int count = 0;
                 
                if (testString.Contains(testSubstring))
                {
                    for (int i = 0; i < testString.Length; i++)
                    {
                        if (testString.Substring(i).Length >= testSubstring.Length)
                        {
                            bool equals = testString.Substring(i, testSubstring.Length).Equals(testSubstring);
                            if (equals)
                            {
                                count++;
                            }
                        }
                    }
                }
                return count;
            }



    I will still want to know how to make it work with telerik advanced filters, so any help is welcome.

    PS: 

    The method is used this way:
    object[] parameters;
    string fe = ConvertFilterExpression(filterExpression, out parameters);
    iQueryable = iQueryable.Where(fe, parameters);
  5. Tsvetoslav
    Admin
    Tsvetoslav avatar
    1823 posts

    Posted 15 Oct 2012 Link to this post

    Hello Gabriel,

    You do need the conversion. The following help topic should guide you on how to imlement it:
    http://www.telerik.com/help/aspnet-ajax/grid-operate-with-filter-expression-manually.html (the last table, comapring linq to entity data source filter expressions)

    Hope it helps.

    Greetings, Tsvetoslav
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
  6. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 16 Oct 2012 Link to this post

    Thank you for the reply but I don't see how this can help me, did you read my posts?
  7. Tsvetoslav
    Admin
    Tsvetoslav avatar
    1823 posts

    Posted 17 Oct 2012 Link to this post

    Hi Gabriel,

    I did read your posts and here is what I had in mind: as far as I understand you need to pass RadGrid's filter expression string to an IQueryable. When you have RadGrid bound to Entity Framework objects, RadGrid's filter expression string is constructed in a way different than the when bound to linq entities. That's why you need to convert to the linq type of format if you are to pass it to an IQueryable. The help topic gives the difference between the two.

    However, if I am mistaken in my understanding, I'd ask you to open up a formal support ticket and send your project as file attachment - do make it a runnable sample in order to speed up its debugging. Thanks in advance for that.


    Greetings, Tsvetoslav
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
  8. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 17 Oct 2012 Link to this post

    Thank you for the reply Tsvetoslav,

    I apologize for being rude with you in the last reply, some of the things you are telling me are true:

    - I do have to apply the filter expression to an IQueryable object which is formed by Entity Framework using POCO. 
    - I have to use Object data source because I have to call a WCF service.

    Now this is weird:
    - According to your documentation, it says a "Contains" filter will generate "@"it.CustomerID LIKE ""%ALFKI%""";" filter expression for an Entity Data Source. I can't use this kind of expression because it is not compatible with Linq.Dynamic library. I need instead something like ".Where("CustomerID.Contains(@0)", myString);" (more like Linq filter expression but with parameters...)

    - The function I provided called ConvertFilterExpression works well with the filters I have tested (numeric, string, DateTIme) (BTW, Telerik does not provide DateTIme filter Expressions in the documentation you gave me).

    Is ConvertFilterExpression the best way to solve it? do you see a better way?

    Thanks
  9. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 19 Oct 2012 Link to this post

    Somebody help, please.

    If you need more info, just ask!

    In advance, many thanks.
  10. Tsvetoslav
    Admin
    Tsvetoslav avatar
    1823 posts

    Posted 22 Oct 2012 Link to this post

    Hi Gabriel,

    Yes, you do need conversion to make the predicate passed to the dynamic linq library understandable to it. And in the case of the DateTime objects, it should be in the following format:
    (BirthDate < DateTime.Parse("10/6/1948 12:00:00 AM"))

    So, if your filter expressions is being set to something like this:
    (it.BirthDate > DATETIME'1948-10-06 00:00')

    you need to convert it to the above format.

    I will give a note to the support team maintaining the help to add the DateTime formats to the topic in question.


    All the best, Tsvetoslav
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
  11. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 22 Oct 2012 Link to this post

    Thank you for the reply Tsvetoslav,

    So I will have to create a method. I can't figure why Telerik does not have support for Entity Framework if it is only a 'transform' issue.


    Greetings
  12. Tsvetoslav
    Admin
    Tsvetoslav avatar
    1823 posts

    Posted 25 Oct 2012 Link to this post

    Hi Gabriel,

    RadGrid does have support for Entity framework but the dynamic linq library (which is MS free one) has a specific format for the filter expressions and if you are to use the dynamic linq library you have to comply with that format.


    All the best, Tsvetoslav
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
  13. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 25 Oct 2012 Link to this post

    if what you say it's true, how can I make it work right-out-of-the-box? (consider please, the fact that Data is available only through WCF SOAP Service)

    Greetings
  14. Tsvetoslav
    Admin
    Tsvetoslav avatar
    1823 posts

    Posted 26 Oct 2012 Link to this post

    Hi Gabriel,

    I think there is some misunderstanding on both sides in our discussion. Could you paste your complete aspx, code-behind and the code files for the object data source operations. Thanks.


    Greetings, Tsvetoslav
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
  15. Dempsey
    Dempsey avatar
    8 posts
    Member since:
    Jul 2012

    Posted 26 Oct 2012 Link to this post

    >> Thank you for the reply but I don't see how this can help me, did you read my posts?

    <rant>
    Hah, that was exactly the question that ran through my head when I read that reply.
    And what's worse, I have somewhat the same question, but related more to using Stored Procedures and filter queries. So I was highly interested in seeing the responses to these very detailed, very clear questions with excellent, supplied example code.
    So often in these forums, I see replies that seem to just point us off to some random location. It would be so much more helpful if original replies (i.e., the first reply to a user's question) were more helpful, perhaps by having the replier restate the user's question in his/her own words, state any possible confusions, and then for each confusion, point to A if the problem is X, point to B if the problem is Y, etc. I realize this would be more work on the part of Tech Support, but I think it would make the customer base a lot more happy and productive.
    </rant>
  16. Tsvetoslav
    Admin
    Tsvetoslav avatar
    1823 posts

    Posted 29 Oct 2012 Link to this post

    Dempsey,

    That's exactly what our support is trying to do.


    All the best, Tsvetoslav
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
  17. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 29 Oct 2012 Link to this post

    I can't reproduce the code, so I attach an image, a small component diagram of the project.

    As you can see, I can't use EntityDataSource directly on the website, I do have to use WCF Services in order to retrieve data.
    Currently I'm sending the following data to the WCF server:

    int startRowIndex
    int maximumRows
    string sortExpression
    string filterExpression

    I will repeat the question. In DAL, how can I use those elements to retrieve the wanted data?

    I hope I explained better....
  18. Tsvetoslav
    Admin
    Tsvetoslav avatar
    1823 posts

    Posted 01 Nov 2012 Link to this post

    Hello Gabriel,

    Your DAL has a certain format of filter expressions that it accepts. For example, if you are sending SQL queries to the database the filter expressions appended to the sql command should be in the format "Where FieldName =/Like etc...". Now, what you have to do is take the grid's filter expressions and convert them to whatever your DAL is expecting.


    Greetings, Tsvetoslav
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
  19. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 05 Nov 2012 Link to this post

    Thanks for the reply,

    My DAL is constructed entirely under Entity Framework 4.3.1.
    I created methods there, in DAL that accept the following arguments
    SelectProducts(string filterExpression, string sortExpression, int maximumRows, int startRowIndex)

    Now, picture this:

    You have an Entity Context called "Model". How can I use the provided info to filter and sort?
    I know you can Skip and Take with "maximumRows" and "startRowIndex" but what about filterExpression and SortExpression.

    I am sending both as EnableLinqExpressions="true"
    Any Idea?
    Should I use Linq.Dynamic or is there another library more suited to solve this problem?

    in advance, many thanks.


  20. Tsvetoslav
    Admin
    Tsvetoslav avatar
    1823 posts

    Posted 08 Nov 2012 Link to this post

    Hi Gabriel,

    Please, give us some more time to investigate the GetBindingData function - I received a notification from our technical lead that it was desgined to support linq to sql and not entity framework. I will be getting back to you with our findings.


    All the best,
    Tsvetoslav
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
  21. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 08 Nov 2012 Link to this post

    Thank you, I will be waiting for your reply :)
  22. Answer
    Tsvetoslav
    Admin
    Tsvetoslav avatar
    1823 posts

    Posted 13 Nov 2012 Link to this post

    Hello Gabriel,

    Following my promise to get back to you with more information, I have received a note from our developers that indeed the GetBindingData function was not designed to work with Linq to Entities and you need to provide a conversion routine for the filter expressions as you have correctly done so already. So, replying to your initial question "Is the ConvertFilterExpression routine" the best approach - yes, that's the best and only approach to this scenario.

    Thanks for the understanding.


    Regards, Tsvetoslav
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
  23. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 13 Nov 2012 Link to this post

    Thank you for the information, Tsvetoslav, I will keep the hard work on the custom conversion Method.

    Anyway, is Telerik planning on adding support to Entity Framework? I mean, today, Entity Framework is one of the most used ORM in microsoft community.

    Greetings
  24. Tsvetoslav
    Admin
    Tsvetoslav avatar
    1823 posts

    Posted 14 Nov 2012 Link to this post

    Hi Gabriel,

    Frankly speaking, this is not on our to-do-list for the coming release. However, it might as well go into our planning for Q2 next year, so, please, log in the issue into PITS so that our management be able to consider it. Thanks for that.


    All the best, Tsvetoslav
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
  25. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 14 Nov 2012 Link to this post

    Thank you, I already did.

  26. Rodolfo
    Rodolfo avatar
    2 posts
    Member since:
    Oct 2012

    Posted 04 Feb 2013 Link to this post

    Is there a place we can vote on so that these changes are included in a nearby update? 
  27. Tsvetoslav
    Admin
    Tsvetoslav avatar
    1823 posts

    Posted 07 Feb 2013 Link to this post

    Hello Rodolfo,

    You can do that in PITs for the feature in question. For new features, please, use the teampulse portal of telerik:
    http://www.telerik.com/feedback.aspx

    Greetings, Tsvetoslav
    the Telerik team
    If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
  28. Claire Thomson
    Claire Thomson avatar
    5 posts
    Member since:
    May 2010

    Posted 27 Aug 2013 Link to this post

    Hi!

    Did you ever find a better way to do this, I'm currently using EF with radGrid and the Dynamic MS lib also but as I have custom properties such as FullName  (combining the Firstname and Surname) it does not seem to work with that - throwing

    The specified type member 'FullName' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.


    Any feedback would be great! I realise this was opened a good time ago...
  29. Gabriel
    Gabriel avatar
    33 posts
    Member since:
    Apr 2011

    Posted 27 Aug 2013 Link to this post

    Yes, Rodolfo Sosa Cordero contacted me from europe and we worked on this for a while untill we get a good solution. I implemented it in this way:

    OdsData is a generic class I created to return the result and allow paging so, I return the total number of items and the items of the current page in this way
    [DataContract(Name="OdsDataFor{0}")]
        public class OdsData<T>
        {
            [DataMember]
            public List<T> Data { get; set; }
            [DataMember]
            public int Count { get; set; }
     
            public OdsData()
            {
                this.Data = new List<T>();
            }
        }

    the correct use is if I call an stored procedure:

    return base.Model.GetDCMasterList(clientId).AsQueryable().FilterAndSort(filterExpression, sortExpression, startRowIndex, maximumRows, true);

    if I call a linq query without stored procedure:
    OdsData<Store> odsStore = this.GetStoreIQueryable().OrderBy(x => x.Id).FilterAndSort(filterExpression, sortExpression, startRowIndex, maximumRows, false);
    (GetStoreIQueryable is a linq call to entity store and returns it as an IQueryable)


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data;
    using System.Reflection;
    using System.Data.Objects;
    using System.Linq.Dynamic;
    using Core.Data.AppModel;
    using System.Text;
    using System.Configuration;
    using System.Diagnostics;
    using System.Text.RegularExpressions;
     
        public static class UtilsExtensions
        {
            /// <summary>
            /// Convierte un FilterExpression enviado por un RadGrid de Telerik a uno válido para ser utilizado
            /// por Linq.Dynamic + Entity Framework
            /// </summary>
            /// <param name="filterExpression">Filter Expression generado por el RadGrid</param>
            /// <param name="parameters">Parámetros encontrados dentro del filterExpression y que deben ser utilizados por Linq.Dynamic</param>
            /// <returns>Retorna un string válido para ser utilizado por Linq.Dynamic</returns>
            public static string ConvertFilterExpression(string filterExpression, out object[] parameters)
            {
                List<object> lstParameters = new List<object>();
                if (!String.IsNullOrEmpty(filterExpression))
                {
                    //replace ToString()       
                    filterExpression = filterExpression.Replace(".ToString()", String.Empty);
     
                    //replace DateTime.Parse
                    int count = Regex.Matches(filterExpression, "DateTime.Parse").Count;
     
                    if (count > 0)
                    {
                        //for the DateTime expression to work we need to handle them as
                        filterExpression = filterExpression.Replace("DateTime.Parse", string.Empty);
     
                        for (int i = 0; i < count; i++)
                        {
                            //Create a new Regular expression that covers all the date types!
                            System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(
                                "\\(\\\"" +
                                    "\\d{1,2}[/-]\\d{1,2}[/-]\\d{2,4}" + //mm/dd/yyyy
                                    "(?:" +
                                        "\\s*\\d{1,2}:\\d{1,2}:\\d{1,2}" + // hh:mm:ss
                                        "(?:" +
                                            "\\s*(?:AM|PM){0,2}" + // AM
                                        "){0,1}" +
                                    "){0,1}" +
                                "\\\"\\)",
                                RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled
                                );
     
                            string date = regex.Match(filterExpression).ToString().Replace("\"", string.Empty).Replace("(", string.Empty).Replace(")", string.Empty);
                            filterExpression = regex.Replace(filterExpression, "@" + i.ToString(), 1);
     
                            DateTime d = DTSafeParse(date);
                            lstParameters.Add(d);
                        }
                    }
                }
                parameters = lstParameters.ToArray();
                return filterExpression;
            }
            private static DateTime DTSafeParse(string any)
            {
                DateTime parsedDate;
                DateTime.TryParse(any, out parsedDate);
                return parsedDate;
            }
     
             public static OdsData<T>  FilterAndSort<T>(this IQueryable<T> iqr, string rawFilterExpression, string sortExpression, int startRowIndex, int maximumRows, bool isStoredProcedure)
            {
                iqr = UtilsExtensions.FilterAndSortIQueryable(iqr, rawFilterExpression, sortExpression);
     
                OdsData<T> ods = new OdsData<T>();
                
                if (isStoredProcedure)
                {
                    ods.Data = iqr.ToList();
                    ods.Count = ods.Data.Count;
     
                    ods.Data = ods.Data.Skip(startRowIndex).ToList();
                    if (maximumRows > 0)
                        ods.Data = ods.Data.Take(maximumRows).ToList();
                }
                else
                {
                    ods.Count = iqr.Count();
                    iqr = iqr.Skip(startRowIndex);
                    if (maximumRows > 0)
                        ods.Data = iqr.Take(maximumRows).ToList(); // se deshace de lo innecesario.
                    else
                        ods.Data = iqr.ToList();
                }
                return ods;
            }
     
            internal static IQueryable<T> FilterAndSortIQueryable<T>(this IQueryable<T> iqr, string rawFilterExpression, string sortExpression)
                    {
                        if (!string.IsNullOrEmpty(sortExpression))
                            iqr = iqr.OrderBy(sortExpression);
     
                        if (!string.IsNullOrEmpty(rawFilterExpression))
                        {
                            object[] parameters;
                            string fe = Tools.UtilsExtensions.ConvertFilterExpression(rawFilterExpression, out parameters);
                            iqr = iqr.Where(fe, parameters);
                        }
                        return iqr;
                    }
        }


    I hope you understand, I actually don't have so much time to clear things up, so any doubt just ask.

    I don't know if it will work with custom properties though :/
  30. Claire Thomson
    Claire Thomson avatar
    5 posts
    Member since:
    May 2010

    Posted 27 Aug 2013 Link to this post

    That's great thanks for your response!

    I'm getting round the custom property at the moment by defining a new class with the Fullname and returning that in the query.

    Hopefully this will assist with the dates I have though as they're also causing issues

    C.
  31. Rodolfo
    Rodolfo avatar
    2 posts
    Member since:
    Oct 2012

    Posted 27 Aug 2013 Link to this post

    Hey there. I never really tried to query combined fields but perhaps it wont be as troubling. Bottom line what you need to do is get the "filterexpression" field from the Radgrid and use Dynamic Linq for the magic. Then once you have that expression run it through the function that Gabriel posted earlier to translate it. Finally, take the translated filterexpression (string) and apply it to the query using the dynamic extension: var result = query.Where(translatedFilterExpression, parameters). 

    I know this is a bit high level but I just have a few minutes b4 I need to get back to work. Hopefully it'll be enough to get you going. 






Back to Top
UI for ASP.NET Ajax is Ready for VS 2017