2011-11-14 56 views
0

我在EF 4.0上运行联接linq查询时遇到问题。下面是代码,去除了所有不必要的报表,还是再现错误)使用Linq与实体框架4.0一起失败

using (var threadRepo = new Repo<Thread>()) 
using (var postRepo = new Repo<Post>()) 
{ 
    var query = threadRepo 
        .Join(postRepo, t => t.PostId, s => s.Id, (t, s) => 1); 

    var array = query.ToArray(); 
} 

回购是我实现仓库的模式,以及加入方法是这样的:

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. 

同样的查询在LinqPad工作针对同一数据库(虽然offcourse,有没有EF 4.0有)

from t in Thread 
join p in Post on t.PostId equals p.Id 
select 1 

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

这给了我和以前一样的错误。

感谢 Jaspreet

+0

'sparkRepo'与'postRepo'是否一样? –

+0

是的,对不起。我纠正了错字。 – floatingfrisbee

回答

1

我看到一个常见的错误是,数据上下文是在仓库级别和每个存储库使用不同的数据背景下 - 在这种情况下,将解释错误。相反,您的存储库应该使用工作单元模式共享相同的数据上下文。

+0

酷...我应该可以很容易地尝试,因为我也实施了UoW。将报告回来,让你知道如果工作。 – floatingfrisbee

+0

试过,但似乎没有工作。我用我使用的代码更新了这个问题。 – floatingfrisbee

+0

它可能没有解决问题,但这绝对是一个工作要求。最有可能的另一个问题是在你的存储库层本身,即我可以看到你正在使用'IEnumerable'它应该是'IQueryable' - 这很难得到正确的,不值得EF(imo)的努力,因为EF已经提供一个抽象的你。 – BrokenGlass