“Namespace.ClassName'的成员访问'DataType MemberName'在类型'System.Collections.Generic.IEnumerable`1 [Namespace.ClassName]上不合法。”

时间:2010-02-17 21:19:27

标签: c# linq-to-sql

我希望解决当前的问题,但如果我能理解错误的实际含义,我会更喜欢。

我的数据库中有两个表的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 ...)但是没有用。我不确定下一步该尝试什么。我想,如果我知道错误试图告诉我什么,我可以找到解决方案。目前,我不知道为什么会员访问是非法的。

3 个答案:

答案 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”。