我一直在搜索Select和SelectMany之间的区别,但我还没有找到合适的答案。我需要学习使用LINQ to SQL时的差异,但我所找到的都是标准数组示例。
有人能提供一个LINQ到SQL的例子吗?
我一直在搜索Select和SelectMany之间的区别,但我还没有找到合适的答案。我需要学习使用LINQ to SQL时的差异,但我所找到的都是标准数组示例。
有人能提供一个LINQ到SQL的例子吗?
当前回答
没有太多的技术-数据库与许多组织,每个有许多用户:-
var orgId = "123456789";
var userList1 = db.Organizations
.Where(a => a.OrganizationId == orgId)
.SelectMany(a => a.Users)
.ToList();
var userList2 = db.Users
.Where(a => a.OrganizationId == orgId)
.ToList();
都为所选组织返回相同的ApplicationUser列表。
第一个“项目”从Organization到Users,第二个直接查询Users表。
其他回答
Some SelectMany可能不需要。以下2个查询给出相同的结果。
Customers.Where(c=>c.Name=="Tom").SelectMany(c=>c.Orders)
Orders.Where(o=>o.Customer.Name=="Tom")
对于一对多关系,
如果从“1”开始,则需要SelectMany,它将平展many。 如果从“Many”开始,则不需要SelectMany。(仍然能够从“1”中过滤,这也比以下标准的连接查询更简单)
from o in Orders
join c in Customers on o.CustomerID equals c.ID
where c.Name == "Tom"
select o
SelectMany扁平查询,返回列表的列表。例如
public class PhoneNumber
{
public string Number { get; set; }
}
public class Person
{
public IEnumerable<PhoneNumber> PhoneNumbers { get; set; }
public string Name { get; set; }
}
IEnumerable<Person> people = new List<Person>();
// Select gets a list of lists of phone numbers
IEnumerable<IEnumerable<PhoneNumber>> phoneLists = people.Select(p => p.PhoneNumbers);
// SelectMany flattens it to just a list of phone numbers.
IEnumerable<PhoneNumber> phoneNumbers = people.SelectMany(p => p.PhoneNumbers);
// And to include data from the parent in the result:
// pass an expression to the second parameter (resultSelector) in the overload:
var directory = people
.SelectMany(p => p.PhoneNumbers,
(parent, child) => new { parent.Name, child.Number });
Live Demo。net Fiddle
只是为了另一种观点,可能会帮助一些函数式程序员:
选择是映射 SelectMany是绑定的(或flatMap的Scala/Kotlin人)
没有太多的技术-数据库与许多组织,每个有许多用户:-
var orgId = "123456789";
var userList1 = db.Organizations
.Where(a => a.OrganizationId == orgId)
.SelectMany(a => a.Users)
.ToList();
var userList2 = db.Users
.Where(a => a.OrganizationId == orgId)
.ToList();
都为所选组织返回相同的ApplicationUser列表。
第一个“项目”从Organization到Users,第二个直接查询Users表。
当查询返回一个字符串(一个char数组)时更清楚:
例如,如果列表" Fruits "包含" apple "
'Select'返回字符串:
Fruits.Select(s=>s)
[0]: "apple"
'SelectMany'将字符串平展:
Fruits.SelectMany(s=>s)
[0]: 97 'a'
[1]: 112 'p'
[2]: 112 'p'
[3]: 108 'l'
[4]: 101 'e'