Невозможно создать постоянное значение типа 'T' - PullRequest
2 голосов
/ 11 июня 2011

У меня есть таблица с именем Предметы ,

У меня есть еще одна таблица под названием Распределения , в которой хранятся Распределения субъектов

У меня есть Datagridview , который заполняется субъектными распределениями из Распределения Таблица

Теперь мне нужно получить Субъекты , которые не в Datagridview

Для этого

  1. Я получаю все Субъекты из ObjectContext
  2. Теперь я получаю все Предметы , которые выделены из Datagridview (Возвращает мне InMemory Collection)
  3. Теперь я использую метод LINQ.EXCEPT для фильтрации результатов, но он выдает следующее исключение,

"Невозможно создать постоянное значение типа" ObjectContext.Subjects "В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid)."

Ниже мой код

    public static IOrderedQueryable<Subject> GetSubjects()
    {
        return OBJECTCONTEXT.Subjects.OrderBy(s => s.Name);
    }

    private IQueryable<Subject> GetAllocatedSubjectsFromGrid()
    {
          return (from DataGridViewRow setRow in dgv.Rows          
                    where !setRow.IsNewRow
                    select setRow.DataBoundItem).Cast<Allocation>()  //I know the Problem lies somewhere in this Function
                    .Select(alloc =>alloc.Subject).AsQueryable();
    }

    private void RUN()
    {
        IQueryable<Subject> AllSubjects = GetSubjects(); //Gets

        IQueryable<Subject> SubjectsToExclude = GetAllocatedSubjectsFromGrid();

        IQueryable<Subject> ExcludedSubjects = AllSubjects.Except(SubjectsToExclude.AsEnumerable());   
        //Throwing Me "Unable to create a constant value of type 'OBJECTCONTEXT.Subject'. Only primitive types ('such as Int32, String, and Guid') are supported in this context."
    }

В результате поиска в Google я обнаружил, что это происходит потому, что LINQ не может сравнивать коллекцию InMemory (записи из DGV) и Objectcontext (FromDB)

Ответы [ 2 ]

2 голосов
/ 12 июня 2011

Немного не хватает времени, еще не проверял. Но я думаю, вы можете попытаться сохранить все это в памяти. Поэтому вместо использования

  IQueryable<Subject> AllSubjects = GetSubjects(); //Gets

Вы делаете

List<Subject> AllSubjects = GetSubjects().ToList(); //

List<Subject> SubjectsToExclude = GetAllocatedSubjectsFromGrid().ToList();    

List<Subject> ExcludedSubjects = AllSubjects.Except(SubjectsToExclude);       
0 голосов
/ 14 января 2015

Я обошел это путем сравнения ключей в предложении Where вместо использования Except.

Так что вместо:

var SubjectsToExclude = GetAllocatedSubjectsFromGrid();
var ExcludedSubjects = AllSubjects.Except(SubjectsToExclude.AsEnumerable());

Нечто похожее:

var subjectsToExcludeKeys =
   GetAllocatedSubjectsFromGrid()
   .Select(subject => subject.ID);

var excludedSubjects =
   AllSubjects
   .Where(subject => !subjectsToExcludeKeys.Contains(subject.ID));

(Я думаю, как выглядит ключ вашей сущности.)

Это позволяет вам хранить все в Entity Framework, а не вытягивать все в память.

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