Анонимный тип и получение значений вне области метода - PullRequest
0 голосов
/ 21 августа 2010

Я создаю сайт asp.net в .net Framework 4.0, и я застрял в методе, который должен вызывать класс .cs и получить обратно результат запроса, это мой вызов метода и метод

1: форма вызова метода aspx.cs page:

helper cls = new helper();
  var query = cls.GetQuery(GroupID,emailCap); 

2: Метод в классе помощника:

public IQueryable<VariablesForIQueryble> GetQuery(int incomingGroupID, int incomingEmailCap)
    {
        var ctx = new some connection_Connection();
        ObjectSet<Members1> members = ctx.Members11;
        ObjectSet<groupMember> groupMembers = ctx.groupMembers;

        var query = from m in members
                    join gm in groupMembers on m.MemberID equals gm.MemID
                    where (gm.groupID == incomingGroupID) && (m.EmailCap == incomingEmailCap)
                    select new VariablesForIQueryble(m.MemberID, m.MemberFirst, m.MemberLast, m.MemberEmail, m.ValidEmail, m.EmailCap);
                    //select new {m.MemberID, m.MemberFirst, m.MemberLast, m.MemberEmail, m.ValidEmail, m.EmailCap};

        return query ;
    }

Я тоже безуспешно пытался использовать приведенный выше код с IEnumerable.Это код для класса VariablesForIQueryble:

3: Класс сам по себе для получения типа анонимного и приведения его к соответствующим типам:

public class VariablesForIQueryble
{
    private int _emailCap;
    public int EmailCap
    {
        get { return _emailCap; }
        set { _emailCap = value; }
    }`....................................

4: и конструктор:

 public VariablesForIQueryble(int memberID, string memberFirst, string memberLast, string memberEmail, int? validEmail, int? emailCap)
    {

            this.EmailCap = (int) emailCap;
            .........................

    }

Кажется, я не могу получить результат запроса, сначала он сообщил мне о проблеме анонимного типа, я создал класс после прочтения этого: текст ссылки ;и теперь он говорит мне конструкторы с параметрами не поддерживается.Теперь я являюсь промежуточным разработчиком, есть ли простое решение для этого или мне нужно вернуться к странице .aspx.cs.

Ответы [ 2 ]

0 голосов
/ 23 августа 2010

Использовано отражение для решения проблемы:

A: Запрос, больше не использующий пользовательский класс "VariablesForIQueryble":

 //Method in helper class 
 public IEnumerable GetQuery(int incomingGroupID, int incomingEmailCap)
        {

            var ctx = new some_Connection();
            ObjectSet<Members1> members = ctx.Members11;
            ObjectSet<groupMember> groupMembers = ctx.groupMembers;

            var query = from m in members
                        join gm in groupMembers on m.MemberID equals gm.MemID
                        where ((gm.groupID == incomingGroupID) && (m.EmailCap == incomingEmailCap)) //select m;
                        select new {  m.MemberID,  m.MemberFirst,  m.MemberLast, m.MemberEmail,  m.ValidEmail, m.EmailCap };
                        //select new VariablesForIQueryble (m.MemberID, m.MemberFirst, m.MemberLast, m.MemberEmail, m.ValidEmail, m.EmailCap);
            //List<object> lst = new List<object>();

            //foreach (var i in query)
            //{
            //    lst.Add(i.MemberEmail);
            //}
            //return lst;
            //return query.Select(x => new{x.MemberEmail,x.MemberID,x.ValidEmail,x.MemberFirst,x.MemberLast}).ToList();
            return query;
        }

B: код для захвата объектов и преобразования этих объектов с использованием отражения

  helper cls = new helper();
  var query = cls.GetQuery(GroupID,emailCap);      
 if (query != null)
                    {

                        foreach (var objRow in query)
                        {

                            System.Type type = objRow.GetType();
                            int memberId = (int)type.GetProperty("MemberID").GetValue(objRow, null);
                            string memberEmail = (string)type.GetProperty("MemberEmail").GetValue(objRow, null);
    }
    else
    {
    something else....
    }
0 голосов
/ 21 августа 2010

Если вы хотите проецировать на конкретный тип .NET типа, подобного этому, вам нужно заставить запрос фактически выполняться, используя .AsEnumerable() или .ToList(), а затем использовать .Select() против linq для объектов.

Вы можете оставить свой оригинальный анонимный тип, чтобы указать, что вы хотите вернуть из базы данных, затем вызвать .ToList() для нее и затем .Select(...) для перепроектирования.

Вы также можете несколько очистить свой код, используя ассоциацию сущностей между группами и участниками, используя ассоциацию FK в базе данных. Тогда запрос становится намного проще:

var result = ctx.Members11.Include("Group").Where(m => m.Group.groupID == incomingGroupID && m.EmailCap == incomingEmailCap);

У вас все еще есть проблема с выбором, чтобы указать, какие столбцы возвращать, и затем вызовом .ToList () для принудительного выполнения перед перепроецированием на новый тип.

Другая альтернатива - создать представление в вашей базе данных и импортировать , который , в качестве сущности в Entity Designer.

...