您的位置:首页 > 其它

指定的 LINQ 表达式包含对与不同上下文关联的查询的引用。

2013-11-08 16:21 453 查看
var itemsNextIDs = itemInChannelRepository.Filter(i => i.ProductID > id ).Select(i => i.ProductID).ToList();
 
var productNext = from p in productRepository.Filter(p => p.ID > id )
                                  join i in itemsNextIDs
                                  on p.ID equals i
                                  orderby p.ID
                                  select p;
Model.Product product2 = productPre.FirstOrDefault();


上面的写法可以完成查询

============================================================================================================================ok

我本来是这样写的:(会报错:“...... 指定的 LINQ 表达式包含对与不同上下文关联的查询的引用。”)

var productNext = from p in productRepository.Filter(p => p.ID > id )
                                  join i in itemInChannelRepository.Filter(i => i.ProductID > id )
                                  on p.ID equals i.ProductID
                                  orderby p.ID
                                  select p;
Model.Product product2 = productPre.FirstOrDefault()


上面的查询需要访问两个上下文。解决方法是分两次查询。

============================================================================================================================error

var itemsNext = itemInChannelRepository.Filter(i => i.ProductID > id );
 
var productNext = from p in productRepository.Filter(p => p.ID > id )
                                  join i in itemsNext 
                                  on p.ID equals i.ProductID
                                  orderby p.ID
                                  select p;
Model.Product product2 = productPre.FirstOrDefault();


像上面这样写又会出问题:(会报错:“...... 此上下文仅支持基元类型(“例如 Int32、String 和 Guid”)。”)

报错的原因是在涉及到内存中的对象与EF里的对象混合查询时,内存中的对象要是基元类型。

============================================================================================================================error

var itemsNextIDs = itemInChannelRepository.Filter(i => i.ProductID > id ).Select(i => i.ProductID);
 
var productNext = from p in productRepository.Filter(p => p.ID > id )
                                  join i in itemsNextIDs
                                  on p.ID equals i
                                  orderby p.ID
                                  select p;
Model.Product product2 = productPre.FirstOrDefault();

像上面这样写又会出问题:(会报错:“...... 指定的 LINQ 表达式包含对与不同上下文关联的查询的引用。”)

第一次查询实际上会因为EF的延时加载,不会立即将数据查询到内存中。

解决方法是对第一次查询使用ToList()

============================================================================================================================error

所以最终结果是:

var itemsNextIDs = itemInChannelRepository.Filter(i => i.ProductID > id ).Select(i => i.ProductID).ToList();
 
var productNext = from p in productRepository.Filter(p => p.ID > id )
                                  join i in itemsNextIDs
                                  on p.ID equals i
                                  orderby p.ID
                                  select p;
Model.Product product2 = productPre.FirstOrDefault();


============================================================================================================================ok

参考文章:http://blog.csdn.net/zzuqqiu/article/details/7185107

http://bbs.csdn.net/topics/390448261?page=1#post-394395668
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐