Заполните список в POCO, используя подвыбор - LINQ для Entites - PullRequest
2 голосов
/ 14 ноября 2011

Я пытаюсь создать список POCO из моей базы данных.Класс POCO имеет свойство List<int>, которое я хочу заполнить следующим образом:

public List<Pocos.MyTable> GetData()
{
    using (EFContext c = new EFContext())
    {
        var query = from t in c.MyTable
                    select new Pocos.MyTable()
                    {
                        MyId = t.MyId,
                        MyField = t.MyField,
                        MyRelationIds = t.MyRelations.Select(mr => mr.MyRelationId).ToList()
                    };

        return query.ToList();
    }
}

К сожалению, я получаю «этот метод не может быть преобразован в выражение хранилища» на ToList() в запросе,Могу ли я сделать это здесь или мне нужно выполнить много последующих запросов, чтобы заполнить свойство MyRelationIds?

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Из вашего кода и описания я понял, что если попытаться просто использовать MyRelations, он не загружается. И тогда вы пытаетесь ввести MyRelationsIds во время запроса. Есть два способа решить это. Я лично предпочитаю первый:

  1. Замените ваше свойство MyRelations на public virtual List<Relation> MyRelations. Виртуальный - это соглашение, после которого EF создаст прокси, который будет действовать как ленивое свойство. То есть он будет загружен, как только вы прикоснетесь к нему.
  2. Другой способ - использовать готовую загрузку, при этом вам не нужно менять подпись. Просто используйте метод Include, чтобы сообщить EF, какие реквизиты вы хотите загрузить с нетерпением. Посмотрите, что .Include("MyRelations") говорит о том, что MyRelations должны быть загружены во время этого запроса. Таким образом, вы можете использовать их позже. И если вы хотите иметь только идентификаторы отношений, то вам следует сначала материализовать свои объекты, а затем сделать отображение (примечание AsEnumerable())

    using (EFContext c = new EFContext())
    {
        var query = from t in c.MyTable.Include("MyRelations").AsEnumerable()
        select new Pocos.MyTable()
        {
            MyId = t.MyId,
            MyField = t.MyField,
            MyRelationIds = t.MyRelations.Select(mr => mr.MyRelationId).ToList()
        };
    
        return query.ToList();
     }
    
0 голосов
/ 14 ноября 2011

Вы пытались удалить ".ToList ()" из строки:

MyRelationIds = t.MyRelations.Select(mr => mr.MyRelationId).ToList()

, чтобы она выглядела так:

MyRelationIds = t.MyRelations.Select(mr => mr.MyRelationId)

?

...