[英]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);
}
}
}
您可以使用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
版本可確保在沒有匹配項的情況下不會出現異常。 它將返回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.