«Доступ члена« DataType MemberName »для« Namespace.ClassName »недопустим для типа« System.Collections.Generic.IEnumerable`1 [Namespace.ClassName]. » - PullRequest
4 голосов
/ 18 февраля 2010

Мне бы хотелось решить мою текущую проблему, но я бы хотел ДАЖЕ БОЛЬШЕ, если бы смог понять, что на самом деле означает эта ошибка.

У меня есть классы LINQ to SQL для двух таблиц в моей БД: Поставщики и Назначения .Я добавил следующий член в класс Provider:

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

Затем я связываю GridView, используя запрос, который извлекает из родительского Provider и использует дочерний элемент Assignments , например:

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 (), когда он фактически выполняет запрос, он выдает следующую ошибку:

Доступ к элементу 'System.String Category'of' Namespace.Assignment 'недопустимо для типа' System.Collections.Generic.IEnumerable`1 [Namespace.Assignment].

Я пытался проверить наличие нулей (a => a! =null && a.Category ...) но это не сработало.Я не уверен, что попробовать дальше.Я думаю, что, если бы я знал, что ошибка пытается сказать мне, я мог бы найти решение.В настоящее время я не знаю, почему доступ членов был бы незаконным.

Ответы [ 3 ]

3 голосов
/ 18 февраля 2010

То, что Assignments свойство все неправильно. Прежде всего, методы получения свойств не должны иметь побочных эффектов, и, что более важно, классы сущностей никогда не должны иметь обратных зависимостей от 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
}
0 голосов
/ 18 февраля 2010

Удалите пользовательские свойства назначений.В своем dbml-файле Linq-To-SQL создайте связь между провайдерами и назначениями, в которой родительское свойство - это провайдеры, а свойство участия - как участвующее свойство для обеих сущностей.LINQ сгенерирует свойство «IEnumerable Assignments» на основе совпадений между ProviderID с использованием согласованного DataContext.

0 голосов
/ 18 февраля 2010

Я думаю, что где-то не знает тот тип, который есть в IEnumerable. Вы пытаетесь вызвать метод, который не является частью интерфейса IEnumerable.

Почему бы просто не переместить запрос из свойства в метод PopulateProviders ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...