簡體   English   中英

如何通過LINQ獲取單個對象? 錯誤:查詢結果不能被多次枚舉

[英]How to get a single object by LINQ? ERROR: The result of a query cannot be enumerated more than once

我的代碼是這樣的:

    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);
            }
        }
    }

您可以使用SingleSingleOrDefault()以下操作:

// 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版本可確保在沒有匹配項的情況下不會出現異常。 它將返回null。

也:
而不是使用ToString()RoleId解析ddlRoles.SelectedValue到合適的類型,你在LINQ查詢,因為一些方法使用它之前( ToString()就是其中之一),LINQ查詢執行針對數據庫內不支持。

你可以做 :

var aRole = _allRoles.ToList().FirstOrDefault(rol => rol.RoleId.ToString() == ddlRoles.SelectedValue);
var aRole = _allRoles.Single(x=>x.RoleId.ToString() == ddlRoles.SelectedValue);

如果我錯了,請糾正我,但是這也是一個可能的選擇

這樣的事情會做:

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(); 
    } 
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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM