مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

salman_b

عضویت از 1396/02/18

ایجاد لیست جنریک با نوع داده ای نامشخص (پرکاربرد در Entity Framework)

  • دوشنبه 9 بهمن 1396
  • 20:58
تشکر میکنم

با سلام

چطوری میشه یک generic list با نوع داده ی نامشخص تعریف کرد ؟

مثلا خروجی کوئری زیر رو میشه ریخت توی var اما من میخوام این رو به صورت یک لیست جنریک نگهداری کنم

var query = context.Persons.Select(c => c);

راهی که مرسوم هستش اینه که اینکار رو بکنیم

List<Persons> query = context.Persons.Select(c => c).ToList();

حالا فرض کنید که مثلا من بخوام یک ستون رو انتخاب کنم که میشه به صورت زیر

var query = context.Persons.Select(c => new { c.Name });

خب توی این حالت کامپایلر میاد اون فیلدی رو که new شده به عنوان anonymous  types در نظر میگیره و خروجی رو خودش میتونه هندل کنه و query رو پر کنه!

اما من میخوام خودم هم بتونم این موضوع رو هندل کنم و نتایج کوئری رو در لیست جنریک ذخیره سازی کنم بدون اینکه جنریک لیست رو از روی مدلی خاص ایجاد کنم، مثلا یه چیزی تو مایه های زیر:

خود ویژوآل استادیو یک لیست ایجاد میکنه با دستور زیر و نوع داده ای ورودی لیست رو anonymous  types در نظر میگیره:

var query = context.Persons.Select(c => new { c.Name }).ToList();

من میخوام اون var query رو به List<T> query تبدیل کنم که T،  نوع داده ای نامشخص باشه

پاسخ های این پرسش

تعداد پاسخ ها : 2 پاسخ
کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • دوشنبه 9 بهمن 1396
  • 23:21

ممنون از این که سوالتون رو واضح و کامل مطرح کردید.

بعد از تحقیق درباره این موضوع تنها راه حل استفاده از یک کلاس dto یا همان ViewModel است. شما میتوان بجای باز گردانی یک نوع ناشناس یک (dto(data transfer object باز گردانی کنید.

        public class QuestionDto
        {
            public string Name { get; set; }   
        }
        
        var list = _questions.Select(q => new QuestionDto { Name =  q.Name}).ToList();

کاربر سایت

AmirGhasemi

عضویت از 1392/02/25

  • سه شنبه 10 بهمن 1396
  • 15:37

باسلام

من یک کلاس نوشته بودم که بصورت جنریک عملیات CRUD  را انجام می دهد.

فکر می کنم این کدها بتواند ایده ی خوبی برای شما باشد

 public class Repository<T> : IRepository<T> where T : class, Models.IEntity
    {
        public int Create(T entity)
        {
            Models.DatabaseContext context = new Models.DatabaseContext();
            try
            {
                context.Set<T>().Add(entity);
                context.SaveChanges();
                return entity.ID;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (context != null)
                    context.Dispose();
            }
        }
        public bool Update(T entity, int id)
        {
            Models.DatabaseContext context = new Models.DatabaseContext();
            try
            {
                var exist = context.Set<T>().Find(id);
                if (exist != null)
                {
                    context.Entry(exist).CurrentValues.SetValues(entity);
                    context.SaveChanges();
                    return true;
                }
                else
                    return false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (context != null)
                    context.Dispose();
            }
        }
        public bool Delete(int id)
        {
            Models.DatabaseContext context = new Models.DatabaseContext();
            try
            {
                var result = context.Set<T>().Find(id);
                if (result != null)
                {
                    context.Set<T>().Remove(result);
                    context.SaveChanges();
                    return true;
                }
                else
                    return false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                context.Dispose();
            }
        }

        public List<T> Read(T value)
        {
            throw new NotImplementedException();
        }

        public T Read(int id)
        {
            Models.DatabaseContext context = new Models.DatabaseContext();
            try
            {
                var result = context.Set<T>().Find(id);
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (context != null)
                    context.Dispose();
            }
        }

        public List<T> SelectAll()
        {
            Models.DatabaseContext context = new Models.DatabaseContext();
            try
            {
                List<T> result = context.Set<T>().ToList<T>();
                return result;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

    }

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)