كيف يمكنك نقل تنفيذ التعبير الذي تم إنشاؤه بواسطة كائن IQueryable إلى IEnumerable؟

StackOverflow https://stackoverflow.com/questions/503208

سؤال

في الكود الخاص بي، أرغب في جعل مستودعاتي IQueryable.بهذه الطريقة، ستكون معايير الاختيار عبارة عن شجرة تعبير linq.

الآن إذا أردت الاستهزاء بمستودعي من الناحية النظرية، فهذا أمر سهل للغاية:ما عليك سوى تنفيذ واجهة المستودع الخاص بي (وهو أيضًا كائن IQueryable).

سيكون تطبيق المستودع الوهمي الخاص بي مجرد مجموعة في الذاكرة، ولكن سؤالي هو:هل تعرف طريقة سهلة لتنفيذ واجهة IQueryable الخاصة بي، لنقل الاستعلام إلى مجموعتي في الذاكرة (IEnumerable)؟

شكرا لأستجابتك،

بعض الدقة

سيستخدم كائن العميل في المستودع الخاص بي المستودع الخاص بي بهذه الطريقة:

نتيجة var = من الإدخال في MyRepository حيث حدد الإدخال. المنتج == "SomeProduct" ؛

ما يفعله ToList أو AsEnumerable هو تنفيذ الاستعلام وإرجاع النتيجة كقائمة أو كـ IEnumerable.لكن لا بد لي من تنفيذ واجهة IQueryable في مستودع التخزين الخاص بي، باستخدام IQueryProvider الذي يحول التعبير في استدعاء إلى كائن IEnumerable.

حل

يتمثل تنفيذ الحل في تفويض استدعاء IQueryable إلى مجموعة inmemory الخاصة بي باستخدام AsQueryable.

public class MockRepository : IQueryable<DomainObject>
    {
        private List<DomainObject> inMemoryList = new List<DomainObject>();

        #region IEnumerable<DomainObject> Members

        public IEnumerator<DomainObject> GetEnumerator()
        {
            return inMemoryList.GetEnumerator();
        }

        #endregion

        #region IEnumerable Members

        IEnumerator IEnumerable.GetEnumerator()
        {
            return inMemoryList.GetEnumerator();
        }

        #endregion

        #region IQueryable Members

        public Type ElementType
        {
            get
            {
                return inMemoryList.AsQueryable().ElementType;
            }
        }

        public Expression Expression
        {
            get
            {
                return inMemoryList.AsQueryable().Expression;
            }
        }

        public IQueryProvider Provider
        {
            get
            {
                return inMemoryList.AsQueryable().Provider;
            }
        }

        #endregion
    }
هل كانت مفيدة؟

المحلول

يستخدم AsQueryable على سخرياتك.أصبحت الآن قابلة للاستعلام ويمكنك التعامل معها مثل أي شيء آخر قابل للاستعلام.

نصائح أخرى

هل يمكنك استخدام طريقة التمديد

.ToList<>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top