Явное построение типа сущности [MyClass] в запросе не допускается - PullRequest
8 голосов
/ 01 июня 2010

Как видно из заголовка, у меня есть следующее исключение:

Описание: Код события: 3005 Сообщение о событии: произошло необработанное исключение.Информация об исключении: Тип исключения: NotSupportedException Сообщение об исключении: Явное построение типа объекта «Company.Project.Core.Domain.Friend» в запросе не допускается.

Я использую LINQ to SQL и имеюследующий код в моем тексте данных:

var friends2 = (
    from f in dc.Friends
    where f.MyFriendsAccountId == accountId
    where f.AccountId != accountId
    select new 
    {
        f.FriendId,
        AccountId = f.MyFriendsAccountId,
        MyFriendsAccountId = f.AccountId, 
        f.CreateDate,
        f.Timestamp
    }).Distinct();

result.AddRange(
    from o in friends2
    select new Friend()
    {
        FriendId = o.FriendId, 
        AccountId = o.AccountId, 
        CreateDate = o.CreateDate, 
        MyFriendsAccountId = o.MyFriendsAccountId, 
        Timestamp = o.Timestamp
    });

последний блок кода выдает ошибку, и я почти уверен, что это утверждение является виновником:

.Select( o => **new Friend**

Как мне бытьпереработать мой код, чтобы избежать этой ошибки?

Ответы [ 2 ]

11 голосов
/ 02 июня 2010

Объекты, которые являются частью контекста данных, не могут быть созданы с помощью запроса LINQ. Это продуманное дизайнерское решение команды C #. Поскольку сущности обновляются (вручную) в операторе Select, это будет означать, что они не отслеживаются DataContext, и это может смутить разработчиков. С другой стороны, когда DataContext автоматически вставляет при отправке эти обновленные объекты, это также может сбивать с толку. Единственным оставшимся вариантом было сообщить разработчикам, что это не очень хорошая идея, и именно это вы видели.

1 голос
/ 20 июля 2012

Это сработает, если у вас не установлен PrimaryKey ни в одном столбце в классе Друзей. Таким образом, изменения больше не будут отслеживаться для этого класса, но ваш код будет работать.

...