我对 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/