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.youkuaiyun.com/zzuqqiu/article/details/7185107
http://bbs.youkuaiyun.com/topics/390448261?page=1#post-394395668