我希望解决当前的问题,但如果我能理解错误的实际含义,我会更喜欢。
我的数据库中有两个表的LINQ to SQL类:提供程序和分配。我将以下成员添加到Provider类:
public IEnumerable<Assignment> Assignments
{
get
{
return (new linqDataContext())
.Assignments
.Where(a => a.ProviderID == this.ProviderID);
}
}
然后,我使用来自父提供商的查询绑定GridView并使用子成员分配,如下所示:
protected void PopulateProviders()
{
linqDataContext context = new linqDataContext();
var list = from p in context.Providers
where (p.Assignments.Count(a => a.Category == ddlCategory.SelectedValue) > 0)
select p;
lvProviders.DataSource = list;
lvProviders.DataBind();
}
在.DataBind()中,当它实际运行查询时,会抛出以下错误:
'Namespace.Assignment'的成员访问'System.String类别'在类型'System.Collections.Generic.IEnumerable`1 [Namespace.Assignment]上不合法。
我已经尝试检查空值(a =&gt; a!= null&amp;&amp; a.Category ...)但是没有用。我不确定下一步该尝试什么。我想,如果我知道错误试图告诉我什么,我可以找到解决方案。目前,我不知道为什么会员访问是非法的。
答案 0 :(得分:3)
那个Assignments
属性都错了。首先,属性getter不应该有副作用,更重要的是,实体类永远不应该对DataContext
具有反向依赖性。 Linq to SQL无法解密此查询;它依赖于一个属性来处理Linq to SQL无法理解的各种疯狂的东西。
立即删除Assignments
属性 。而不是这样做,您需要将此查询编写为连接:
int category = (int)ddlCategory.SelectedValue;
var providers =
from p in context.Providers
join a in context.Assignments
on p.ProviderID equals a.ProviderID
into g
where g.Count(ga => ga.Category == category) > 0
select p;
如果我正确理解了代码的意图,那应该做你想做的事。
最后一点注意事项:您从未在任何方法中妥善处理DataContext
。你应该像这样包装它:
using (var context = new linqDataContext())
{
// Get the data here
}
答案 1 :(得分:0)
我认为某处它不知道IEnumerable中的那种类型。您正在尝试调用不属于IEnumerable接口的方法。
为什么不直接将查询从属性移出到PopulateProviders()方法?
答案 2 :(得分:0)
删除自定义的Assignments属性。在您的Linq-To-SQL dbml文件中,在Providers和Assignments之间创建关联,将Providers作为父属性,ProviderID作为两个实体的Participating Property。 LINQ将使用一致的DataContext基于ProviderID之间的匹配生成属性“IEnumerable Assignments”。