New Posts New Posts RSS Feed: XtraGrid LinqServerMode
  FAQ FAQ  Forum Search   Calendar   Register Register  Login Login

XtraGrid LinqServerMode

 Post Reply Post Reply
Author
erturkcevik View Drop Down
Groupie
Groupie


Joined: 14-Jun-2007
Location: Turkey
Posts: 40
Post Options Post Options   Quote erturkcevik Quote  Post ReplyReply Direct Link To This Post Topic: XtraGrid LinqServerMode
    Posted: 08-Dec-2009 at 1:29pm
Hi,
When the XtraGrid control operates in server mode, it delegates all data processing to the server, and loads only records to be displayed on screen. This allows you to dramatically increase performance against large datasets
Can I binding entity data to DevExpress XtraGrid at LinqServeMode ?
 
 
Best Regards,
Back to Top
davidklitzke View Drop Down
IdeaBlade
IdeaBlade
Avatar

Joined: 14-Jun-2007
Posts: 715
Post Options Post Options   Quote davidklitzke Quote  Post ReplyReply Direct Link To This Post Posted: 08-Dec-2009 at 3:23pm

Have you looked at the requested DevEx feature personally? It appears to be inextricably tied to DevEx’s proprietary data access technology, XPO; specifically it requires an implementer of DevExpress.Data.IListServer.

You may safely assume that we have no intention of integrating with XPO.   We will not support this IListServer interface or the ServerMode option. You are welcome to try to implement it yourself.  You can implement the IListServer interface using DevForce as the storage proxy in place of DevEx’s proprietary, 2-tier, cacheless XPO.

Back to Top
erturkcevik View Drop Down
Groupie
Groupie


Joined: 14-Jun-2007
Location: Turkey
Posts: 40
Post Options Post Options   Quote erturkcevik Quote  Post ReplyReply Direct Link To This Post Posted: 09-Dec-2009 at 11:43am
< = =text/> //
  < id=1 method=post name=1 =ViewSource.aspx?Id=cd827f53-7e67-46d4-badc-fc2a0ce9de30&showJS=false>
Can I using this solulation with DevForce EF?
 
Regards,
 
 

This simple IListServer interface implementation is made to illustrate the interface members: what data is passed in arguments, and what result these members are expected to produce. Only essential interface members are implemented.

 
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Collections;
using DevExpress.Data;
using DevExpress.Data.Filtering;
using DevExpress.Data.Filtering.Helpers;

namespace DevExpress.Sample
{
    public class SimpleServerModeDataSource: IListServer
    {
        Type objectType;
        PropertyDescriptor pdKey;

        ArrayList storage; //hoax
        ArrayList storageProxy;
        Hashtable groups;
        Dictionary<object, object> totals;

        CriteriaOperator filter;
        ListSortDescriptionCollection sortInfo;
        int groupCount;
        List<ListSourceSummaryItem> summaryInfo;
        List<ListSourceSummaryItem> totalSummaryInfo;


        public SimpleServerModeDataSource(Type objectType, string keyProperty, ICollection data)
            :this(objectType, keyProperty)
        {
            storage.AddRange(data);
            ProcessCollection();
        }

        public SimpleServerModeDataSource(Type objectType, string keyProperty)
        {
            this.objectType = objectType;
            PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(objectType);
            pdKey = pdc[keyProperty];

            storage = new ArrayList();
            storageProxy = new ArrayList();
            groups = new Hashtable();
            totals = new Dictionary<object, object>();
        }

        private void SummaryCollect(Dictionary<object, object> dict, List<ListSourceSummaryItem> info, object obj)
        {
            if (info == null || dict == null) return;
            foreach (ListSourceSummaryItem item in info)
            {
                decimal acc = 0;
                try
                {
                    acc = Convert.ToDecimal(dict[item.Key]);
                }
                catch { }
                if (item.SummaryType == SummaryItemType.Count)
                {
                    acc++;
                }
                else
                {
                    decimal v = 0;
                    try
                    {
                        v = Convert.ToDecimal(item.Descriptor.GetValue(obj));
                    }
                    catch { }
                    switch (item.SummaryType)
                    {
                        case SummaryItemType.Sum:
                            acc += v;
                            break;
                    }
                }
                dict[item.Key] = acc;
            }
        }

        private void SummarySetUp(Dictionary<object, object> dict, List<ListSourceSummaryItem> info)
        {
            if (info == null || dict == null) return;
            dict.Clear();
            foreach (ListSourceSummaryItem item in info)
            {
                dict.Add(item.Key, 0);
            }
        }

        private void ProcessCollection()
        {
            PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(objectType);
            ExpressionEvaluator evaluator = new ExpressionEvaluator(pdc, filter);
            storageProxy.Clear();
            SummarySetUp(totals, totalSummaryInfo);
            foreach (object o in storage)
            {
                if (evaluator.Fit(o))
                {
                    storageProxy.Add(o);
                    SummaryCollect(totals, totalSummaryInfo, o);
                }
            }
            if (sortInfo != null)
            {
                storageProxy.Sort(new SimpleComparer(sortInfo));
            }
            groups.Clear();
        }

        #region IListServer Members

        public void ApplySort(ListSortDescriptionCollection sortInfo, int groupCount, List<ListSourceSummaryItem> summaryInfo, List<ListSourceSummaryItem> totalSummaryInfo)
        {
            this.sortInfo = sortInfo;
            this.groupCount = groupCount;
            this.summaryInfo = summaryInfo;
            this.totalSummaryInfo = totalSummaryInfo;
            ProcessCollection();
        }

        public CriteriaOperator FilterCriteria
        {
            get
            {
                return filter;
            }
            set
            {
                if (Equals(filter, value)) return;
                filter = value;
                ProcessCollection();
            }
        }

        public int FindIncremental(PropertyDescriptor column, string value, int startIndex, bool searchUp)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public object FindKeyByBeginWith(PropertyDescriptor column, string value)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public object FindKeyByValue(PropertyDescriptor column, object value)
        {
            foreach (object o in storageProxy)
            {
                if (Equals(column.GetValue(o), value))
                    return pdKey.GetValue(o);
            }
            return null;
        }

        public List<ListSourceGroupInfo> GetGroupInfo(ListSourceGroupInfo parentGroup)
        {
            List<ListSourceGroupInfo> rows = new List<ListSourceGroupInfo>();
            ArrayList uniqueValues = new ArrayList();
            int level = (parentGroup == null) ? 0 : (parentGroup.Level + 1);
            PropertyDescriptor pd = sortInfo[level].PropertyDescriptor;
            foreach (object o in storageProxy)
            {
                ListSourceGroupInfo group = parentGroup;
                while (group != null)
                {
                    System.Diagnostics.Debug.Assert((group.Level == 0) || groups[group] != null);
                    object fv = sortInfo[group.Level].PropertyDescriptor.GetValue(o);
                    if (!Equals(fv, group.GroupValue)) goto Skip;
                    group = (ListSourceGroupInfo)groups[group];
                }
                object v = pd.GetValue(o);
                ListSourceGroupInfo info;
                int index = uniqueValues.IndexOf(v);
                if (index < 0)
                {
                    uniqueValues.Add(v);
                    info = new SimpleListSourceGroupInfo();
                    info.GroupValue = v;
                    info.Level = level;
                    SummarySetUp(info.Summary, summaryInfo);
                    rows.Add(info);
                    groups.Add(info, parentGroup);
                }
                else
                {
                    info = rows[index];
                }
                info.ChildDataRowCount++;
                SummaryCollect(info.Summary, summaryInfo, o);
                Skip:;
            }
            return rows;
        }

        public int GetRowIndexByKey(object key)
        {
            for (int i = 0; i < storageProxy.Count; i++)
            {
                if (Equals(pdKey.GetValue(storageProxy[i]), key))
                    return i;
            }
            return -1;
        }

        public object GetRowKey(int index)
        {
            return pdKey.GetValue(this[index]);
        }

        public Dictionary<object, object> GetTotalSummary()
        {
            return totals;
        }

        public object[] GetUniqueColumnValues(PropertyDescriptor descriptor, int maxCount, bool includeFilteredOut, bool roundDataTime)
        {
            ArrayList uniqueValues = new ArrayList();
            IList list = includeFilteredOut ? storage : storageProxy;
            foreach (object o in list)
            {
                object v = descriptor.GetValue(o);
                int index = uniqueValues.IndexOf(v);
                if (index < 0)
                {
                    uniqueValues.Add(v);
                    if (maxCount > 0 && uniqueValues.Count >= maxCount)
                        break;
                }
            }
            return uniqueValues.ToArray();
        }

        #endregion

        #region IList Members

        public int Add(object value)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public void Clear()
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public bool Contains(object value)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public int IndexOf(object value)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public void Insert(int index, object value)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public bool IsFixedSize
        {
            get { throw new Exception("The method or operation is not implemented."); }
        }

        public bool IsReadOnly
        {
            get { throw new Exception("The method or operation is not implemented."); }
        }

        public void Remove(object value)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public void RemoveAt(int index)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public object this[int index]
        {
            get
            {
                return storageProxy[index];
            }
            set
            {
                throw new Exception("The method or operation is not implemented.");
            }
        }

        #endregion

        #region ICollection Members

        public void CopyTo(Array array, int index)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public int Count
        {
            get { return storageProxy.Count; }
        }

        public bool IsSynchronized
        {
            get { throw new Exception("The method or operation is not implemented."); }
        }

        public object SyncRoot
        {
            get { throw new Exception("The method or operation is not implemented."); }
        }

        #endregion

        #region IEnumerable Members

        public IEnumerator GetEnumerator()
        {
            return storageProxy.GetEnumerator();
        }

        #endregion
    }

    class SimpleListSourceGroupInfo : ListSourceGroupInfo
    {
        private Dictionary<object, object> summary;
        public override Dictionary<object, object> Summary
        {
            get { return summary; }
        }
        public SimpleListSourceGroupInfo()
        {
            summary = new Dictionary<object, object>();
        }
    }

    class SimpleComparer : IComparer
    {
        ListSortDescriptionCollection sortInfo;

        public SimpleComparer(ListSortDescriptionCollection sortInfo)
        {
            this.sortInfo = sortInfo;
        }

        #region IComparer Members

        public int Compare(object x, object y)
        {
            foreach (ListSortDescription info in sortInfo)
            {
                object xx = info.PropertyDescriptor.GetValue(x);
                object yy = info.PropertyDescriptor.GetValue(y);
                int sign = Comparer.Default.Compare(xx, yy);
                if (sign != 0)
                    return (info.SortDirection == ListSortDirection.Ascending) ? sign : -sign;
            }
            return 0;
        }

        #endregion
    }
}
//.name == "cd827f53-7e67-46d4-badc-fc2a0ce9de30") { iFrames.style.visibility = "visible"; } } } //]]>
Back to Top
WardBell View Drop Down
IdeaBlade
IdeaBlade
Avatar

Joined: 31-Mar-2009
Location: Emeryville, CA,
Posts: 338
Post Options Post Options   Quote WardBell Quote  Post ReplyReply Direct Link To This Post Posted: 09-Dec-2009 at 11:15pm
This looks like an example provided by Developer Express itself. It is an empty shell that doesn't do anything ... it's a mock ... or so it seemed to me when I first read it awhile ago. It may be a good guide for writing your own implementation but it isn't sufficient to page DevForce data in as written ... which is what I think you are looking to do.
 
IdeaBlade will not be supporting this interface. We assist only with populating Windows Forms and with data binding of controls to data sources. We leave it to you to determine how the objects get into those data sources.
 
I encourage you to implement the IListServer interface using DevForce on your own. I'd love to hear from you when you have done so, especially if you are willing to share the results with others in the DevForce community.
Back to Top
erturkcevik View Drop Down
Groupie
Groupie


Joined: 14-Jun-2007
Location: Turkey
Posts: 40
Post Options Post Options   Quote erturkcevik Quote  Post ReplyReply Direct Link To This Post Posted: 11-Dec-2009 at 2:34pm
Thank you for reply
What can I do improve performance with working large data? How can I improve data binding performance?
Please say me methots of the Devforce EF.
 
Regards,
 
Back to Top
erturkcevik View Drop Down
Groupie
Groupie


Joined: 14-Jun-2007
Location: Turkey
Posts: 40
Post Options Post Options   Quote erturkcevik Quote  Post ReplyReply Direct Link To This Post Posted: 13-Dec-2009 at 11:01am
DevExpress Says :
 
Thank you for the suggestion. I'm afraid that we have to decline it. The LinqServerModeSource can be associated with any queryable source, i.e. the data source should implement the IQueryable interface. We aren't going to support the Server Mode for other data source type, sorry.

Thanks,
Uriah.

Back to Top
WardBell View Drop Down
IdeaBlade
IdeaBlade
Avatar

Joined: 31-Mar-2009
Location: Emeryville, CA,
Posts: 338
Post Options Post Options   Quote WardBell Quote  Post ReplyReply Direct Link To This Post Posted: 14-Dec-2009 at 5:59pm
DevForce 2009 (our LINQ version) supports IQueryable and could be a basis for building your own implementation.

We are also considering development of a self-paging collection. "Considering" ... not doing.  I have some ideas about how that might work which I intend to prototype if I get the time.
 
Sorry I can't commit to more right now.
Back to Top
erturkcevik View Drop Down
Groupie
Groupie


Joined: 14-Jun-2007
Location: Turkey
Posts: 40
Post Options Post Options   Quote erturkcevik Quote  Post ReplyReply Direct Link To This Post Posted: 15-Dec-2009 at 10:50am
Thank you for answers. I think performance important for working large dataset
and  I recommend, you adding feature of the "delayed load data" or bindable paging data to Devforce as soon as.
This features existing standart  of the Devforce.
 
Regards,
 
Back to Top
Thinkly View Drop Down
Newbie
Newbie


Joined: 25-Feb-2010
Posts: 5
Post Options Post Options   Quote Thinkly Quote  Post ReplyReply Direct Link To This Post Posted: 25-Feb-2010 at 1:34am
Back to Top
 Post Reply Post Reply

Forum Jump Forum Permissions View Drop Down