Sql 使用Linq连接实体框架4.0失败
我在对EF 4.0运行join linq查询时遇到问题。下面是代码,去掉了所有不必要的语句,仍在复制错误) 同一查询在LinqPad中针对同一数据库工作(当然,这里没有EF4.0) 关于Linq为什么给我这个例外有什么线索吗 更新 根据下面的建议,我尝试使用一个工作单元为两个存储库使用公共datacontext。然而,这似乎并不能解决问题。下面是我使用的代码Sql 使用Linq连接实体框架4.0失败,sql,linq,entity-framework,linqpad,Sql,Linq,Entity Framework,Linqpad,我在对EF 4.0运行join linq查询时遇到问题。下面是代码,去掉了所有不必要的语句,仍在复制错误) 同一查询在LinqPad中针对同一数据库工作(当然,这里没有EF4.0) 关于Linq为什么给我这个例外有什么线索吗 更新 根据下面的建议,我尝试使用一个工作单元为两个存储库使用公共datacontext。然而,这似乎并不能解决问题。下面是我使用的代码 using (var uow = new UnitOfWork<CommunicationEntities>()) {
using (var uow = new UnitOfWork<CommunicationEntities>())
{
using (var threadRepo = new Repo<Thread>(uow))
using (var postRepo = new Repo<Post>(uow))
{
var query = threadRepo
.Join(postRepo, t => t.PostId, s => s.Id, (t, s) => 1);
var array = query.ToArray();
}
}
使用(var uow=new UnitOfWork())
{
使用(var threadRepo=新回购(uow))
使用(var postRepo=新回购(uow))
{
var query=threadRepo
.Join(postRepo,t=>t.PostId,s=>s.Id,(t,s)=>1);
var array=query.ToArray();
}
}
这给了我和以前一样的错误
谢谢
Jaspreet我看到的一个常见错误是,数据上下文位于存储库级别,每个存储库使用不同的数据上下文—在本例中,这可以解释错误。相反,您的存储库都应该使用工作单元模式共享相同的数据上下文。sparkRepo与
postRepo
相同吗?是的,很抱歉。我纠正了错误。酷。。。我应该能够很容易地尝试,因为我已经实现了UoW。我会向你汇报,让你知道这是否有效。我试过了,但似乎不起作用。我已经用我使用的代码更新了这个问题。它可能没有解决这个问题,但它肯定是这项工作的要求。最有可能的另一个问题是存储库层本身,也就是说,我可以看到您正在使用IEnumerable
,而它应该是IQueryable
——这很难做到正确,不值得EF(imo)付出努力因为EF已经为您提供了一个抽象。您是说我应该在存储库的连接方法中使用IQueryable吗?是否也可以使用实体上的导航属性?每种方法的优点/缺点是什么?@floatingfrisbee:只要看一眼,我就认为第一个参数是IQueryable inner
——但我可能错了,仅仅看这个摘录就很难看出。
public IEnumerable<TResult> Join<TInner, TKey, TResult>(
IEnumerable<TInner> inner,
Expression<Func<TEntity, TKey>> outerSelector,
Expression<Func<TInner, TKey>> innerSelector,
Expression<Func<TEntity, TInner, TResult>> result)
{
return _objectSet.Join(inner, outerSelector, innerSelector, result);
}
Unable to create a constant value of type 'Post'.
Only primitive types ('such as Int32, String, and Guid')
are supported in this context.
from t in Thread
join p in Post on t.PostId equals p.Id
select 1
using (var uow = new UnitOfWork<CommunicationEntities>())
{
using (var threadRepo = new Repo<Thread>(uow))
using (var postRepo = new Repo<Post>(uow))
{
var query = threadRepo
.Join(postRepo, t => t.PostId, s => s.Id, (t, s) => 1);
var array = query.ToArray();
}
}