我有一个招聘管理系统应用程序,包含两个实体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
,带有programmer
和designer
标签。
当我搜索这些标签时,它会返回第一条记录,但找不到第二条。
例如,我为人员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方法