首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ多对多的地方

LINQ多对多的地方
EN

Stack Overflow用户
提问于 2016-11-07 20:49:36
回答 1查看 1.4K关注 0票数 3

如何编写EF7 (核心)/ SQL友好的多到多LINQ查询?

比如说,我有很多会说多种语言的朋友,我想为一套语言找到所有的朋友。

代码语言:javascript
复制
class Friend
{
    Guid Id { get; set; }
    ICollection<FriendLanguage> Languages { get; set; }
}

class Language
{
    Guid { get; set; }
    ICollection<FriendLanguage> Friends { get; set; }
}

class FriendLanguage
{
    Friend { get; set; }
    Language { get; set; }
}

考虑到我有一组语言I IEnumerable<Guid>,我想找回所有讲这些语言的朋友。

我试过这个..。

代码语言:javascript
复制
friends
    .Include(o => o.Languages).ThenInclude(o => o.Language)
    .SelectMany(o => o.Languages).Select(o => o.Language.Id)
    .Intersect(languages);

...but --它只返回一组简化的Guids...not,它完全确定从这里到哪里,或者即使我在正确的路径上。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-07 21:15:58

如果我的理解是正确的,你想让那些会说语言的朋友们把所有的语言都从列表中拿出来。

表达您的需求的最自然的LINQ查询是:

代码语言:javascript
复制
var friends = db.Friends
    .Include(o => o.Languages).ThenInclude(o => o.Language)
    .Where(o => languages.All(id => o.Languages.Any(fl => fl.Language.Id == id)));

不幸的是,它不是SQL友好的。事实上,memory目前无法将其转换为SQL,而是会读取内存中的数据并在其中进行筛选。

所以你可以用这个代替:

代码语言:javascript
复制
var friends = db.Friends
    .Include(o => o.Languages).ThenInclude(o => o.Language)
    .Where(o => o.Languages.Count(fl => languages.Contains(fl.Language.Id)) == languages.Count);

这意味着这样的事情:

代码语言:javascript
复制
SELECT [o].[Id]
FROM [Friends] AS [o]
WHERE (
    SELECT COUNT(*)
    FROM [FriendLanguages] AS [fl]
    WHERE [fl].[LanguageId] IN ('6e64302f-24db-4717-a5fe-2cc61985ca3a', '2c216a63-1f6a-4fad-9105-d5f8ece3fa3c') AND ([o].[Id] = [fl].[FriendId])
) = @__languages_Count_1
ORDER BY [o].[Id]

如果您确实希望使用列表中语言的的朋友,那么Where就更简单了:

代码语言:javascript
复制
.Where(o => o.Languages.Any(fl => languages.Contains(fl.Language.Id)))

SQL是:

代码语言:javascript
复制
SELECT [o].[Id]
FROM [Friends] AS [o]
WHERE EXISTS (
    SELECT 1
    FROM [FriendLanguages] AS [fl]
    WHERE [fl].[LanguageId] IN ('ed3f85a7-e122-45dd-b0af-2020052d55a7', '4819cb7d-ad43-41a0-a3a1-979b7abc6265') AND ([o].[Id] = [fl].[FriendId]))
ORDER BY [o].[Id]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40474349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档