匿名类型和获取方法范围外的值

时间:2010-08-20 21:19:11

标签: c#-4.0 entity-framework-4 asp.net-4.0

我正在.net框架4.0中构建一个asp.net站点,我坚持使用应该调用.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;
            .........................

    }

我似乎无法获得查询结果,首先它告诉我匿名类型问题,我在阅读完这篇文章后做了一个课:link text;现在它告诉我不支持参数的构造函数。现在我是一名中间开发人员,有一个简单的解决方案,或者我必须将我的查询带回.aspx.cs页面。

2 个答案:

答案 0 :(得分:0)

如果您想要投射到这样的特定类型的.NET类型,则需要使用.AsEnumerable().ToList()强制执行查询,然后对linq使用.Select()对象。

您可以保留原始匿名类型以指定要从数据库返回的内容,然后在其上调用.ToList(),然后.Select(...)重新投影。

您还可以使用数据库中使用FK关联的组和成员之间的实体关联来稍微清理代码。然后查询变得更简单:

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

您仍然需要执行select以指定要返回的列,然后调用.ToList()以在重新投影到新类型之前强制执行。

另一种方法是在数据库中创建一个视图,并将 作为实体导入实体设计器。

答案 1 :(得分:0)

使用反射来解决问题:

答:查询,不再使用自定义的“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....
    }