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

本文介绍了解决在使用LINQ进行跨上下文查询时遇到的问题,包括如何正确处理不同上下文间的关联查询及避免错误的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值