C# &引用;会员访问';数据类型MemberName';属于';Namespace.ClassName';类型'不合法;System.Collections.Generic.IEnumerable`1[Namespace.ClassName]。“;

C# &引用;会员访问';数据类型MemberName';属于';Namespace.ClassName';类型'不合法;System.Collections.Generic.IEnumerable`1[Namespace.ClassName]。“;,c#,linq-to-sql,C#,Linq To Sql,我很想找到一个解决当前问题的方法,但如果我能理解这个错误的真正含义,我会更想知道 我的数据库中有两个表的LINQ to SQL类:提供程序和赋值。我已将以下成员添加到提供程序类: public IEnumerable<Assignment> Assignments { get { return (new linqDataContext()) .Assignments

我很想找到一个解决当前问题的方法,但如果我能理解这个错误的真正含义,我会更想知道

我的数据库中有两个表的LINQ to SQL类:提供程序赋值。我已将以下成员添加到提供程序类:

public IEnumerable<Assignment> Assignments 
    {
        get
        {
            return (new linqDataContext())
                .Assignments
                .Where(a => a.ProviderID == this.ProviderID);
        }
    }
在.DataBind()处,当它实际运行查询时,会抛出以下错误:

成员访问“Namespace.Assignment”的“System.String Category”对“System.Collections.Generic.IEnumerable”1[Namespace.Assignment]类型不合法


我尝试过检查空值(a=>a!=null&&a.Category…),但没有成功。我不知道下一步该试什么。我认为,如果我知道错误试图告诉我什么,我就能找到解决办法。就目前而言,我不知道为什么成员访问是非法的。

赋值
属性是完全错误的。首先,属性getter不应该有副作用,更重要的是,实体类不应该对
DataContext
有反向依赖。Linq to SQL无法破译此查询;它依赖于一个属性,该属性可以完成LinqtoSQL不希望理解的各种疯狂的事情

现在就去掉
赋值
属性。您不需要这样做,而是需要将此查询作为联接编写:

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
}

我想在某个地方它不知道IEnumerable中的类型。您试图调用的方法不是IEnumerable接口的一部分


为什么不将查询从属性移出到PopulateProviders()方法?

删除自定义定义的Assignments属性。在Linq To SQL dbml文件中,在提供者和分配之间创建关联,提供者作为父属性,ProviderID作为两个实体的参与属性。LINQ将使用一致的DataContext根据ProviderID之间的匹配生成属性“IEnumerable Assignments”。

。给你一个额外的分数“让我拥有它”。谢谢你帮我学到了一些重要的东西。@Byron:Lol,如果这是一个咆哮,我很抱歉,这是我解释L2S窒息原因的最好尝试——它看到了这个表情,像我一样发出了“天哪,WTF”的声音P
using (var context = new linqDataContext())
{
    // Get the data here
}