首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以多对多关系获取数据

以多对多关系获取数据
EN

Stack Overflow用户
提问于 2013-11-22 01:21:28
回答 4查看 373关注 0票数 3

我有三个实体:

代码语言:javascript
复制
public class KeywordSearch
{
    // Primary properties
    public int Id { get; set; }
    public string Name { get; set; }

    // Navigation properties
    public Keyword Keyword { get; set; }
}

public class Keyword
{
    // Primary properties
    public int Id { get; set; }
    public string Name { get; set; }

    // Navigation properties
    public virtual ICollection<Address> Addresses { get; set; }
}

public class Address
{
    // Primary properties
    public int Id { get; set; }
    public PTCouncil PTCouncil { get; set; }                 <---------- EDIT

    // Navigation properties
    public virtual ICollection<Keyword> Keywords { get; set; }
}

public class PTCouncil                                       <---------- EDIT
{
    // Primary properties
    public int Id { get; set; }
    public string Name { get; set; }
}

根据一组单词,我需要提取所有不同的地址Id。

将在KeywordSearch表中搜索与地址相关的匹配关键字的单词。

到目前为止,在William的帮助下,我做到了这一点,但是获取匹配所有和部分单词的关键字,并且我需要将它们全部获取:

编辑:

代码语言:javascript
复制
var addressIds = (
              from ks in keywordSearchQuery
              where splitKeywords.Contains(ks.Name)
              select ks.Keyword.Addresses.Select(k => k.Id)
             )
             .ToList()
             .Aggregate((a, b) => a.Intersect(b));

示例:

代码语言:javascript
复制
KeywordSearch = {1,"RENAULT",1},{2,"MORAIS",2},{3,"SOARES",3},{4,"CENTRO",4}
Keyword       = {1,"Renault",{1,2}},{2,"Morais",{1}},{3,"Soares",{1}},{4,"Centro",{2}}
Address       = {1,"Renault Morais Soares",{1,2,3}},{2,"Renault Centro",{1,2}}

If I search "RENAULT MORAIS SOARES", I should get AddressId = 1
If I search "RENAULT CENTRO", I should get AddressId = 2
If I search "RENAULT", I should get AddressId = 1,2

Actual Search Problem: If I search "RENAULT XXXX", I get 1,2 and I should get nothing.

我还需要按位置过滤,我已经尝试过了,但我得到了一个错误“指定的类型成员'PTCouncil‘在LINQ to Entities中不受支持”

代码语言:javascript
复制
keywordsAddressIds = from ks in keywordSearchQuery
                     where splitKeywords.Contains(ks.Name)
                     select ks.Keyword.Addresses.Where(p => p.Location.Distance(centerPoint) < radius * 1000).Select(a => a.Id);

有什么想法吗?

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2013-12-02 22:43:59

我认为你需要在两个操作中做到这一点。

首先获取所有关键字地址:

代码语言:javascript
复制
var result = from ks in keywordSearchQuery
           where splitKeywords.Contains(ks.Name)
           select ks).ToList().Aggregate((a, b) => a.Intersect(b));

然后查看是否所有关键字都有结果,如果没有,则不返回任何内容

代码语言:javascript
复制
if (splitKeywords.Any(s => !result.Any(t => t.Name.Contains(s))))
            {
                return null;
            }

这是伪代码,但我认为您应该能够从这里弄清楚。

--EDIT--出于好奇,您不是已经在使用多个操作了吗?是否要阻止数据库调用,除非所有条件都已满足?但是,当您执行.ToList()时,您将使用来自DB的数据填充列表(操作1),然后将其填充到聚合+交集(操作2?)。我假设您可以用相同的方式添加第二个操作(代码未测试) ->

代码语言:javascript
复制
var result = from ks in keywordSearchQuery
               where splitKeywords.Contains(ks.Name)
               select ks).ToList().Aggregate((a, b) => a.Intersect(b)).Any(s => !result.Any(t => t.Name.Contains(s)));
票数 3
EN

Stack Overflow用户

发布于 2013-11-22 10:22:59

看起来这里有几个问题,我将集中在问题的关键字部分:

如果splitKeywords只需要与地址的关键字相交(原始答案)

代码语言:javascript
复制
var addressIds = (
                  from ks in keywordSearchQuery
                  where splitKeywords.Contains(ks.Name)
                  select ks.Keyword.Addresses.Select(k => k.Id)
                 )
                 .ToList()
                 .Aggregate((a, b) => a.Intersect(b));

如果splitKeywords必须是地址关键字的子集

请注意,我是如何直接引用上下文的addresses的,而不再通过keywordSearchQuery。这样会更简单。

代码语言:javascript
复制
var addressIds = (
                  from a in addresses
                  where !splitKeywords.Except(a.Keywords.Select(kw => kw.Name)).Any()
                  select a.Id
                 )
                 .ToList();

我通过链接到硬编码对象,在我这一端测试了这两种方法。新的LINQ子集查询可能在LINQ中不起作用。让我知道!

票数 2
EN

Stack Overflow用户

发布于 2013-11-22 10:48:46

好的,你需要使用聚合和交集:

代码语言:javascript
复制
 var result = (from ks in keywordSearchQuery
               where splitKeywords.Contains(ks.Name)
               select ks.Keyword.Addresses.Select(a => a.Id))
              .Aggregate((l1, l2) => l1.Intersect(l2))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20127755

复制
相关文章

相似问题

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