gpt4 book ai didi

c# - 获取多对多关系中的数据

转载 作者:行者123 更新时间:2023-11-30 14:57:50 25 4
gpt4 key购买 nike

我有三个实体:

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 的帮助下,我得到了这个,但是得到了匹配所有和一些要搜索的词的关键字,我需要得到它们:

编辑:

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));

例子:

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.

我还需要按位置过滤,我试过这个但我收到错误消息“LINQ to Entities 不支持指定的类型成员‘PTCouncil’”

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);

有什么想法吗?

谢谢。

最佳答案

我认为您需要在两个操作中执行此操作。

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

var result = from ks in keywordSearchQuery
where splitKeywords.Contains(ks.Name)
select ks).ToList().Aggregate((a, b) => a.Intersect(b));

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

if (splitKeywords.Any(s => !result.Any(t => t.Name.Contains(s))))
{
return null;
}

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


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

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)));

关于c# - 获取多对多关系中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20127755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com