Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用Linq连接实体框架4.0失败_Sql_Linq_Entity Framework_Linqpad - Fatal编程技术网

Sql 使用Linq连接实体框架4.0失败

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>()) {

我在对EF 4.0运行join linq查询时遇到问题。下面是代码,去掉了所有不必要的语句,仍在复制错误)

同一查询在LinqPad中针对同一数据库工作(当然,这里没有EF4.0)

关于Linq为什么给我这个例外有什么线索吗

更新

根据下面的建议,我尝试使用一个工作单元为两个存储库使用公共datacontext。然而,这似乎并不能解决问题。下面是我使用的代码

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();
    }
}