我正在开发一个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>
我可以解决这个问题吗?
答案 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
被放置在方法中,那么您将获得访问调用方中方法结果的异常。