linq语法中缺少什么演员?

时间:2010-08-17 18:12:25

标签: linq linq-to-sql

tblUserRole Permission = 
      (oCurrenUserPermission.GetPermission(Convert.ToString(Session["Navigation"])));
if (Permission.IsInsert == 1)
{
}

public IQueryable GetPermission(string sPageName)
{
   IQueryable query;
   #region MyRegion
   query = from r in this.Context.tblUserRoles
              join p in this.Context.tblPageInfos on r.PageID equals p.PageID
             where r.Record_Status == 2 && p.PageName == sPageName
           select r;
   return query;
  #endregion
 }

上面的语法显示了以下错误:

错误1无法将类型'System.Linq.IQueryable'隐式转换为'AkijBeverage.ServiceObject.tblUserRole'。存在显式转换(您是否缺少演员?)E:\ Project-Akij \ 09-July-2010 \ AkijBeverage \ AkijBeverage \ SecurityUserControls \ UCUserRole.ascx.cs 63 43 AkijBeverage

如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

据我所知,该查询与tblUserRole不兼容。

它将返回IEnumereable<bool>而不是tblUserRole。 真正的问题是您在两个不同的位置选择了IsInsert:在查询中,再次在if()

最简单的方法就是返回完整的tblUserRole对象:

return (from r in this.Context.tblUserRoles 
                join p in this.Context.tblPageInfos on r.PageID equals p.PageID 
                where r.Record_Status == 2 && p.PageName == sPageName 
                select r).SingleOrDefault();

答案 1 :(得分:1)

目前您正在返回查询 - 而不是单个项目。您想要返回什么?

这是一个选项,例如:

public tblUserRole GetPermission(string sPageName)
{
    return (from r in this.Context.tblUserRoles
            join p in this.Context.tblPageInfos on r.PageID equals p.PageID
            where r.Record_Status == 2 && p.PageName == sPageName
            select r).FirstOrDefault();
}

这将返回第一个匹配的角色,如果没有,则返回null

如果你想要返回一个查询,那么作为一个强类型的IQueryable<T>会更好:

public IQueryable<tblUserRole> GetPermissions(string sPageName)
{
    return from r in this.Context.tblUserRoles
           join p in this.Context.tblPageInfos on r.PageID equals p.PageID
           where r.Record_Status == 2 && p.PageName == sPageName
           select r;
}

然后你需要将你的调用代码更改为:

tblUserRole Permission 
   oCurrenUserPermission.GetPermissions(Convert.ToString(Session["Navigation"]))
                        .FirstOrDefault();

答案 2 :(得分:-1)

问题是你有一个IQueryable并试图在没有演员的情况下分配给“Type”。

将您的方法更改为:

  public IQueryable<tblUserRole > GetPermission(string sPageName)

然后再做(First / FirstOrDefault / Single / etc ..)

 oCurrenUserPermission.GetPermission(...).FirstOrDefault();

或投下它并交叉手指并选择一个。

   (tblUserRole)oCurrenUserPermission.GetPermission(...).FirstOrDefault();

旁注

我建议您以更友好的方式命名代码。无需在开头添加“类型”。例如,可以更好地命名所有内容:

 string navigationValue = Convert.ToString(Session["Navigation"]);

 UserRole permission = 
  currentUserPermission.GetPermission(navigationValue ).FirstOrDefault();

 //If this isn't a boolean i would consider using one
 if (permission.IsInsert == 1)
 {
 }

 public IQueryable<UserRole> GetPermission(string sPageName)
 {

    #region MyRegion
    var query = from r in this.Context.UserRoles
                    join p in this.Context.PageInformation on r.PageID equals p.PageID
                where r.Record_Status == 2 && p.PageName == sPageName
                select r;
   return query;
   #endregion
 }