C# 如何在.NETCore3中使用LINQ语法查询多个表
我需要在两个数据库表中查询一个搜索词并返回结果。以下内容在EF Core 2中工作:C# 如何在.NETCore3中使用LINQ语法查询多个表,c#,linq,entity-framework-core,.net-core-3.1,C#,Linq,Entity Framework Core,.net Core 3.1,我需要在两个数据库表中查询一个搜索词并返回结果。以下内容在EF Core 2中工作: var SearchTerm = "hello"; IQueryable<TableA> q; q = (from a in context.TableA join b in context.TableB on a equals b.A into leftjoin from c in leftjoin.DefaultIfEmpty()
var SearchTerm = "hello";
IQueryable<TableA> q;
q = (from a in context.TableA
join b in context.TableB on a equals b.A into leftjoin
from c in leftjoin.DefaultIfEmpty()
where c.Column1.Contains(SearchTerm)
|| a.Column1.Contains(SearchTerm)
|| a.Column2.Contains(SearchTerm)
select a);
return q.Include(a => a.TableD)
.GroupBy(a => a.Id)
.Select(group => group.First())
.ToList();
它可以正常工作,但涉及两个数据库查询,因为我已经有了第一个查询中的TableA列表,所以能够使用它而不必提取ID并执行第二个查询将是非常棒的。另外,确保数据库继续处理不同的部分而不是C#也是更好的选择
A和B的定义如下:
public class TableA
{
public int Id { get; set; }
public string Column1 { get; set; }
public string Column2 { get; set; }
public int TableDId { get; set; }
public TableD TableD { get; set; }
}
public class TableB
{
public int Id { get; set; }
public string Column1 { get; set; }
public int TableAId { get; set; }
public TableA TableA { get; set; }
}
如果我理解正确,则在
TableA
和TableB
之间存在一对多关系,因此应该可以向TableA
添加集合导航属性,例如:
public class TableA
{
public int Id { get; set; }
...
public ICollection<TableB> TableBs { get; set; }
}
另一个选项是尝试子查询:
var q = (from a in context.TableA
join b in context.TableB on a.Id equals b.TableAId into leftjoin
from c in leftjoin.DefaultIfEmpty()
where c.Column1.Contains(SearchTerm)
|| a.Column1.Contains(SearchTerm)
|| a.Column2.Contains(SearchTerm)
select a.Id); // remove Distinct and ToList
return context.TableA
.Where(a => q.Contains(a.Id))
.Include(c => c.TableD)
.ToList();
您是否有从
TableA
实体到TableB
实体的导航属性?否导航属性是另一种方式,因此TableB有一个TableA,但TableA没有一个TableB,因为它可以是多个或没有,但每个TableB将有一个TableA您可以添加实体代码吗?抱歉,这是什么意思?类定义?是的,表A和TableB@Josh我很乐意帮忙!
context.TableA
.Where(ta => ta.TableBs.Any(tb => tb.Column1.Contains(SearchTerm))
|| ta.Column1.Contains(SearchTerm)
|| ta.Column2.Contains(SearchTerm))
.Include(c => c.TableD)
.ToList();
var q = (from a in context.TableA
join b in context.TableB on a.Id equals b.TableAId into leftjoin
from c in leftjoin.DefaultIfEmpty()
where c.Column1.Contains(SearchTerm)
|| a.Column1.Contains(SearchTerm)
|| a.Column2.Contains(SearchTerm)
select a.Id); // remove Distinct and ToList
return context.TableA
.Where(a => q.Contains(a.Id))
.Include(c => c.TableD)
.ToList();