Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.NETCore3中使用LINQ语法查询多个表_C#_Linq_Entity Framework Core_.net Core 3.1 - Fatal编程技术网

C# 如何在.NETCore3中使用LINQ语法查询多个表

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

我需要在两个数据库表中查询一个搜索词并返回结果。以下内容在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()                     
     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();