2015-03-27 2 views
1

что не так с этим запросом:System.NotSupportedException: Указанный тип члена «UserPrincipalName» не поддерживается в LINQ для лиц

var user = context.Users.Single(u => u.UserPrincipalName == "[email protected]"); 

почему я получаю это исключение?

UserPrincipleName является собственностью пользователя ...

System.NotSupportedException: The specified type member 'UserPrincipalName' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported. 

Когда я делаю это все в порядке:

var users = context.Users.ToList(); 
var user = users.Single(u => u.UserPrincipalName == "[email protected]"); 

Почему единственная работа для Linq к объектам, но не Linq к Entities?

ответ

0

Если это свойство IdentityElement определение выглядит так:

[ConfigurationProperty(ConfigurationStrings.UserPrincipalName)] 
    public UserPrincipalNameElement UserPrincipalName 
    { 
     get { return (UserPrincipalNameElement)base[ConfigurationStrings.UserPrincipalName]; } 
    } 

http://referencesource.microsoft.com/#System.ServiceModel/System/ServiceModel/Configuration/IdentityElement.cs,d784c9ed0cd1b486

Он возвращает строку, поэтому вы можете использовать его с помощью LINQ к объектам, но EF не может перевести его на SQL, потому что он получает значение, отбрасывая некоторое свойство в базовом классе.

0

UserPrincipalName должно быть сопоставлено столбцу базы данных. EF пытается преобразовать лямбда-выражение u => u.UserPrincipalName == "[email protected]" в сценарий sql и будет жаловаться, если свойство UserPrincipalName не отображается в столбец таблицы.

+0

Но все же ваше высказывание кажется мне неправильным. «UserPrincipalName имеет тип User». Lambda «u» - это тип пользователя, а UserPrincipalName - это свойство строки, поэтому сравнение не должно терпеть неудачу! – Elisabeth

+0

Приносим извинения, я неправильно понял вопрос. Отображает ли UserPrincipalName столбцы в базе данных? –

+0

См. Обновленный ответ. –