我正在.net框架4.0中构建一个asp.net站点,我坚持使用应该调用.cs类并在此处获取查询结果的方法是我的方法调用和方法
helper cls = new helper();
var query = cls.GetQuery(GroupID,emailCap);
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的代码:
public class VariablesForIQueryble
{
private int _emailCap;
public int EmailCap
{
get { return _emailCap; }
set { _emailCap = value; }
}`....................................
public VariablesForIQueryble(int memberID, string memberFirst, string memberLast, string memberEmail, int? validEmail, int? emailCap)
{
this.EmailCap = (int) emailCap;
.........................
}
我似乎无法获得查询结果,首先它告诉我匿名类型问题,我在阅读完这篇文章后做了一个课:link text;现在它告诉我不支持参数的构造函数。现在我是一名中间开发人员,有一个简单的解决方案,或者我必须将我的查询带回.aspx.cs页面。
答案 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)
使用反射来解决问题:
//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;
}
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....
}