首页 新闻 会员 周边 捐助

EF中的Join和Contains的区别是什么

0
[已解决问题] 解决于 2020-06-08 21:09

听说
List<int> lstBizIds = new List<int>() { 1, 2, 3, 4, 5 };
List<int> lstProjectIds = context.Projects.Where(x =>lstBizIds.Contains(x.businessId)).Select(x => x.projectId).ToList();
会翻译成sql 是 in
SELECT Id FROM ProjectsWHERE UserId IN (1, 2, 3, 4, 5, 6)

List<int> lstBizIds = new List<int>() { 1, 2, 3, 4, 5 };
List<int> lstProjectIds = context.Projects.Join(lstBizIds, p => p.businessId, u => u, (p, u) => p.projectId).ToList();
会翻译成sql 是
SELECT Id
FROM Projects
INNER JOIN (VALUES (1), (2), (3), (4), (5)) AS Data(Item) ON Projects.UserId = Data.Item

但是我用join的时候,sql server 监听数据库的sql语句时,join反而是
SELECT Id FROM Projects 的
而且在使用ToListAsync等异步方法的时候,Join性能很差,用Contains反而会很好。这是为什么呢

最佳解决方案的主页 最佳解决方案 | 初学一级 | 园豆:25
提问于:2020-06-06 09:27
< >
分享
最佳答案
0

上面的查询场景完全不需要用 Join

奖励园豆:5
dudu | 高人七级 |园豆:29568 | 2020-06-06 11:08

那用List的数据比较多还是用Contains吗

最佳解决方案 | 园豆:25 (初学一级) | 2020-06-06 11:09

List数据多的时候,in的效率就不行了,刚我用efcore Join List查询,服务器端给了一个warning ,
The LINQ expression 'join Int32 q in __p_0 on [p].Id equals [q]' could not be translated and will be evaluated locally. ,也就是数据查出来再在本地内存中join,很明显这不是我想要的,我在想join list的时候efcore 能给我翻译成sql

最佳解决方案 | 园豆:25 (初学一级) | 2020-06-06 11:13

另外Join list,在efcore 3.x是会抛出异常的

最佳解决方案 | 园豆:25 (初学一级) | 2020-06-06 11:15

@求知若饥,虚心若愚: 还是 LINQ 写法或者实体关系配置的问题,不应该 Join List

dudu | 园豆:29568 (高人七级) | 2020-06-06 11:19

@dudu: 按道理来说,ef 可以生成SELECT Id
FROM Projects
INNER JOIN (VALUES (1), (2), (3), (4), (5)) AS Data(Item) ON Projects.UserId = Data.Item 这样的sql语句,这也是我们想要的sql语句,那ef 代码怎么写才能翻译成这个语句呢

最佳解决方案 | 园豆:25 (初学一级) | 2020-06-06 11:26

@求知若饥,虚心若愚: 参考 Joining in-memory list to Entity Framework query

dudu | 园豆:29568 (高人七级) | 2020-06-06 11:48

@dudu: 好吧,不过可以考虑自己实现Expression的拼接

最佳解决方案 | 园豆:25 (初学一级) | 2020-06-06 12:01
其他回答(2)
0

就和sql里的 join和 like '%hello%'的区别

会长 | 园豆:12463 (专家六级) | 2020-06-08 09:34
0

Join:连接,返回的T where T is class;Contains:(是否)包含,返回 bool;

花飘水流兮 | 园豆:13617 (专家六级) | 2020-06-08 21:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册