Как получить один объект по LINQ?ОШИБКА: результат запроса не может быть перечислен более одного раза - PullRequest
2 голосов
/ 17 марта 2012

Мой код такой:

    private void BindGvUsersInRole ()
    {
        var aRole =
            (from aspnet_Roles rol
                 in _allRoles
            where rol.RoleId.ToString() == ddlRoles.SelectedValue
            select rol).SingleOrDefault();

        this.gvUsersInRole.DataSource = aRole.aspnet_Users;
        this.gvUsersInRole.DataBind();
    }

Я получил ошибку в последней строке:

Сведения об исключении: System.InvalidOperationException: результат запроса не может быть перечислен более одного раза.

затем я изменяю функцию следующим образом (спасибо @VitaliyKalinin):

private void BindGvUsersInRole ()
{
    Guid  roleID=new Guid(ddlRoles.SelectedValue);

    var users =
    (
        from aspnet_Roles rol in _allRoles
        from u in rol.aspnet_Users
        where rol.RoleId == roleID
        select u
    ).ToList();

    this.gvUsersInRole.DataSource = users;
    this.gvUsersInRole.DataBind();
}

ВСЕ ЕЩЕ ОШИБКА !!!!

что происходит!?!?

свойство "aspnet_Users":

    /// <summary>
    /// 没有元数据文档可用。
    /// </summary>
    [XmlIgnoreAttribute()]
    [SoapIgnoreAttribute()]
    [DataMemberAttribute()]
    [EdmRelationshipNavigationPropertyAttribute("realtydbModel", "aspnet_UsersInRoles", "aspnet_Users")]
    public EntityCollection<aspnet_Users> aspnet_Users
    {
        get
        {
            return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<aspnet_Users>("realtydbModel.aspnet_UsersInRoles", "aspnet_Users");
        }
        set
        {
            if ((value != null))
            {
                ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<aspnet_Users>("realtydbModel.aspnet_UsersInRoles", "aspnet_Users", value);
            }
        }
    }

Ответы [ 5 ]

3 голосов
/ 17 марта 2012

Вы можете использовать Single или SingleOrDefault() для этого:

// parse the string `ddlRoles.SelectedValue` into the appropriate type as `roleID`
var roleID = ParseRoleID(ddlRoles.SelectedValue);
var aRole = (from rol in aspnet_Roles.Include("aspnet_Users")
            where rol.RoleId == roleID 
            select rol).Single();

Однако это вызовет исключение, если будет возвращено более одного объекта. Если вы просто хотите, чтобы первая сущность соответствовала регистру, вы можете использовать First() или FirstOrDefault():

var roleID = ParseRoleID(ddlRoles.SelectedValue);
var aRole = (from rol in aspnet_Roles.Include("aspnet_Users")
            where rol.RoleId == roleID 
            select rol).First();

Версии OrDefault этих методов гарантируют, что вы не получите исключение, если нет совпадения. Вместо этого он вернет ноль.

Также:
Вместо использования ToString() на RoleId необходимо выполнить синтаксический анализ ddlRoles.SelectedValue в соответствующий тип, прежде чем использовать его в запросе LINQ, поскольку некоторые методы (ToString() является одним из них) не поддерживаются в запросе LINQ, который выполняется для БД.

1 голос
/ 17 марта 2012
var aRole = _allRoles.Single(x=>x.RoleId.ToString() == ddlRoles.SelectedValue);

Поправьте меня, если я ошибаюсь, но этот вариант также возможен

1 голос
/ 17 марта 2012

Вы можете сделать:

var aRole = _allRoles.ToList().FirstOrDefault(rol => rol.RoleId.ToString() == ddlRoles.SelectedValue);
0 голосов
/ 17 марта 2012
private void BindGvUsersInRole ()
{
    var roleID = new Guid(ddlRoles.SelectedValue);

    var users = (from rol in _allRoles
                 where rol.RoleId == roleID
                 select rol.aspnet_Users).ToList();

    this.gvUsersInRole.DataSource = users;
    this.gvUsersInRole.DataBind();
}
0 голосов
/ 17 марта 2012

Примерно так будет:

private void BindGvUsersInRole () 
    { 
        var aUsers = 
            (from aspnet_Roles rol in _allRoles
from u in rol.aspnet_Users
            where rol.RoleId.ToString() == ddlRoles.SelectedValue 
            select u).ToList(); 

        this.gvUsersInRole.DataSource = aUsers; 
        this.gvUsersInRole.DataBind(); 
    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...