使用从数据库获得的整数并使用它从Linq中检索数据库中的一些数据

时间:2014-12-18 13:51:58

标签: c# asp.net-mvc linq

我正在开发一个Asp.Net MVC应用程序,在其中我检索了一个类型为int的CompanyId,并且我希望使用LINQ从数据库中检索更多数据,我使用以下代码来执行此操作

var companyId = db.UserProfiles.Where(u => u.UserName == User.Identity.Name)
                               .Select(u => u.CompanyId);
return db.CCUserHorizontals.Where(ccu=>companyId.Equals(ccu.CPId));

我从UserProfile中检索了companyId并使用它与CPID进行比较

但是,当我加载页面时,它给我一个错误如下

<m:message>
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.
</m:message>
<m:type>System.InvalidOperationException</m:type>
<m:stacktrace/>
<m:internalexception>
<m:message>
Unable to cast the type 'System.Int32' to type 'System.Object'. LINQ to Entities only supports casting EDM primitive or enumeration types.
</m:message>
<m:type>System.NotSupportedException</m:type>

我可以解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

您的第一个查询将返回IQueryable<int>,它将是整数值的集合,(可能只包含一个/单个值)。稍后您试图在查询中使用它并获取错误。

您的代码应该是:

var companyId = db.UserProfiles.Where(u => u.UserName == User.Identity.Name)
                               .Select(u => u.CompanyId)
                               .FirstOrDefault();
return db.CCUserHorizontals.Where(ccu => ccu.CPId == companyId);

需要注意的事项:

  • 您可以使用FirstOrDefault代替Where,因为FirstOrDefault也会使用谓词

像:

var item = db.UserProfiles.FirstOrDefault(u => u.UserName == User.Identity.Name);
int companyId = 0;
if(item != null) companyId = item.CompanyId;
  • 您可以/ (或可能不)在返回值上调用ToList以实现查询。如果您的DataContext被放置在方法中,那么您将获得访问调用方中方法结果的异常。