【问题标题】:"Member access 'DataType MemberName' of 'Namespace.ClassName' not legal on type 'System.Collections.Generic.IEnumerable`1[Namespace.ClassName]."“'Namespace.ClassName' 的成员访问 'DataType MemberName' 在类型 'System.Collections.Generic.IEnumerable`1[Namespace.ClassName] 上不合法。”
【发布时间】:2010-02-17 21:19:26
【问题描述】:

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

我的数据库中有两个表的 LINQ to SQL 类:ProvidersAssignments。我在 Provider 类中添加了以下成员:

public IEnumerable<Assignment> Assignments 
    {
        get
        {
            return (new linqDataContext())
                .Assignments
                .Where(a => a.ProviderID == this.ProviderID);
        }
    }

然后,我使用从父 Provider 提取并使用子成员 Assignments 的查询绑定 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 Category”在“System.Collections.Generic.IEnumerable`1[Namespace.Assignment] 类型上不合法。

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

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    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
    }
    

    【讨论】:

    • 太棒了。 “让我拥有它”给你加分。感谢您帮助我学习一些重要的东西。
    • @Byron:大声笑,如果它是咆哮的话,我很抱歉,这是我解释 L2S 为何窒息的最佳尝试——它看到了这个表情并像我一样发出“OMG WTF”。 :P
    【解决方案2】:

    我认为它不知道 IEnumerable 中的类型。您正在尝试调用不属于 IEnumerable 接口的方法。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-04-30
        • 2011-09-28
        • 1970-01-01
        • 1970-01-01
        • 2016-07-05
        • 2021-11-13
        • 1970-01-01
        • 1970-01-01
        • 2015-09-14
        相关资源
        最近更新 更多