如何在EF Core中实现搜索



我有一个招聘管理系统应用程序,包含两个实体Person&CCD_ 2。

个人可以有一个标签列表。

这是我的个人实体:

public int Id { get; set; }
public string FirstName { get; set; }
public string Family { get; set; }
public long NationalId { get; set; }
public DateTime BirthDate { get; set; }
public ICollection<TagAggregate> Tags { get; set; }

这是我的标签实体:

public int Id { get; set; }
public string TagName { get; set; }
public string Description { get; set; }
public int PersonId { get; set; }
public PersonAggregate Person { get; set; }

一切都很好,除非我想用标签名搜索人员。

例如,我有一个人John,带有programmerdesigner标签。

当我搜索这些标签时,它会返回第一条记录,但找不到第二条。

例如,我为人员id 1(即"john"(创建了一个具有value programmer的标签名称,然后我为人员id 1(同样为"john(("(创建另一个具有值designer的标签名称!

它只找到程序员(因为我首先创建了它(;设计师";。

当我删除";程序员";标签,那么我可以找到标签名为"的约翰;设计师";。

我不知道问题出在哪里。

这是我的搜索方法:

public async Task<PersonAggregate> FindByTagName(string tagName)
{
var person = DbSet.Where(p => p.Tags
.Select(t => t.TagName == tagName).FirstOrDefault())
.FirstOrDefault();
return person;
}

您可以使用LINQ的.Any((扩展方法来实现您的目标。下面是我们的例子:

public static async Task<PersonAggregate> FindByTagName(string tagName)
{
List<TagAggregate> tags = new List<TagAggregate>() { new TagAggregate() { Id=1 , TagName= "tag1" , Description= "test" , PersonId=1 },
new TagAggregate() { Id=2 , TagName= "test2" ,Description= "tag2" ,PersonId=1 }};
List<PersonAggregate> result = new List<PersonAggregate>()
{
new PersonAggregate(){ Id = 1, FirstName = "ali" , Family= "ghodsi" ,NationalId=3 ,BirthDate=DateTime.Now ,Tags=tags },
};
var person = result
.Single(p => p.Tags.Any(t => t.TagName == tagName));
return person;
}

在我的情况下,我创建了一个示例列表来显示我的示例输出,但在您的情况下应该这样更改您的方法:

public async Task<PersonAggregate> FindByTagName(string tagName)
{
var person = DbSet
.Single(p => p.Tags.Any(t => t.TagName == tagName));
return person;
}

但我建议您在使用async方法时,最好使用async EF Core方法,如ToListAsync((、FirstOrDefaultAsync(。所以我建议你这样改变你的方法:

public async Task<PersonAggregate> FindByTagName(string tagName)
{
return await DbSet
.SingleOrDefaultAsync(p => p.Tags.Any(t => t.TagName == tagName));
}

.Any((扩展方法进入集合并搜索我们期望的条件,如果找到我们期望的值,它将返回该对象。你可以在这里阅读更多关于.Any((linq扩展方法的信息:Enumerable.Any方法

最新更新