Анонимный тип и получение значений за пределами области действия метода

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

1: форма вызова метода aspx.cs страница:

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.


person Developer    schedule 20.08.2010    source источник


Ответы (2)


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

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

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

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

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

Другой альтернативой является создание представления в базе данных и импорт этого как объекта в Entity Designer.

person Ian Mercer    schedule 21.08.2010
comment
Спасибо, райдер, я пошел на размышления, вот ссылка, по которой я получил код и идею: stackoverflow.com/questions/874746/ Я думал о создании представления но это было бы слишком, потому что у меня есть несколько тестовых таблиц и обычных таблиц, из которых мне нужно было получать данные, идея ассоциаций внешнего ключа хороша, но снова у меня были тестовые таблицы. Я устал от метода ToList (), и у меня возникли проблемы. Наконец мне пришлось задуматься. Я очень ценю вашу помощь, сэр. - person Developer; 23.08.2010
comment
Если вы собираетесь использовать подобную слабую типизацию, вы также можете использовать новый тип dynamic в .NET 4 для доступа к различным полям объекта результата. .ToList() должно было работать нормально: (...query...).ToList().Select(x => new VariablesForIQuerable(...)).ToList(); - person Ian Mercer; 23.08.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....
    }
person Developer    schedule 22.08.2010
comment
Я пробовал и этот код, он работает, но я думаю, что отражение лучше foreach (var objRow в запросе) {string [] objects = objRow.ToString (). Split (','); foreach (var o in objects.Where (x = ›x.Contains (@))) {if (o.Contains (@)) {do something}}}, но было 2 цикла и больше работы. - person Developer; 23.08.2010