join - 如何使用 LINQ-to-SQL 连接多个表?

标签 join linq-to-sql

我对 linq 还很陌生,所以请耐心等待。

我正在开发一个 asp.net 网页,我想添加一个“搜索功能”(用户输入姓名或姓氏或两者或其中一部分并获取所有相关信息的文本框)。我有两个表(“人员”和“应用程序”),我想显示人员中的一些列(姓名)和应用程序中的一些列(分数、位置...)。我知道如何使用 sql 来完成此操作,但我想了解有关 linq 的更多信息,因此我想使用 linq 来完成此操作。

现在我有两个主要想法:

1.)

    var person = dataContext.GetTable<Person>();
    var application = dataContext.GetTable<Application>();
    var p1 = from p in Person
             where(p.Name.Contains(tokens[0]) || p.Surname.Contains(tokens[1]))
             select new {Id = p.Id, Name = p.Name, Surname = p.Surname}; //or maybe without this line

 //I don't know how to do the following properly
 var result = from a in Application
                 where a.FK_Application.Equals(index)  //just to get the "right" type of application
                 //this is not right, but I don't know how to do it better
                 join p1
                 on p1.Id == a.FK_Person

2.)另一个想法是通过“应用程序”而不是“加入 p1 ...”来使用

var result = from a in Application
             where a.FK_Application.Equals(index)  //just to get the "right" type of application
             join p from Person
             on p.Id == a.FK_Person
             where p.Name.Contains(tokens[0]) || p.Surname.Contains(tokens[1])      

我认为第一个想法对于没有第一个“where”条件的查询更好,我也打算使用它。不管什么更好(更快),我仍然不知道如何使用 linq 来做到这一点。最后,我想仅显示/选择结果的某些部分(列)(连接表+过滤条件)。

我真的很想知道如何使用 linq 来做这样的事情,因为我还将处理一些与本地数据类似的问题,在这些问题中我只能使用 linq。 有人可以解释一下如何做吗,我花了几天时间试图弄清楚并在互联网上搜索答案。

最佳答案

var result = from a in dataContext.Applications
             join p in dataContext.Persons
             on p.Id equals a.FK_Person
             where (p.Name.Contains("blah") || p.Surname.Contains("foo")) && a.FK_Application == index
             select new { Id = p.Id, Name = p.Name, Surname = p.Surname, a.Score, a.Position };

正如 Odrahn 指出的那样,这将为您提供平坦的结果,一个人可能有很多行,因为一个人可以加入多个具有相同 FK 的应用程序。以下是搜索所有合适人员,然后将相关应用程序添加到结果中的方法:

var p1 = from p in dataContext.Persons
             where(p.Name.Contains(tokens[0]) || p.Surname.Contains(tokens[1]))
             select new {
                Id = p.Id, Name = p.Name, Surname = p.Surname,
                BestApplication = dataContext.Applications.FirstOrDefault(a => a.FK_Application == index /* && ????  */); 
         }; 

抱歉 - 看起来第二个查询将导致每个人往返一次,因此它显然无法扩展。我认为 L2S 会处理得更好。

关于join - 如何使用 LINQ-to-SQL 连接多个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4899262/

相关文章:

mysql - 使用mysql时 `join`是否每次都生成笛卡尔积?

sql - 加入连接条件?

php - 编写双连接来获取产品的子类别

python - 在python中按列连接两个大文件

mysql - 如何根据同一个表中的先前数据更新 SQL 表

c# - LINQ to SQL 等同于 T-SQL 和转换中的 ISDATE()?

c# - Linq to Sql 选择具有嵌套数的项目

c# - 如何将以字符串命名的参数发送到存储过程?

c# - 用户能够看到其他人的详细信息。 FirstOrDefault 返回错误记录?还是缓存问题?帮助! :)

c# - 通过 LINQ to SQL 过滤数据