我一直在搜索Select和SelectMany之间的区别,但我还没有找到合适的答案。我需要学习使用LINQ to SQL时的差异,但我所找到的都是标准数组示例。

有人能提供一个LINQ到SQL的例子吗?


当前回答

Select many就像SQL中的交叉连接操作,它需要叉乘。 例如,如果我们有

Set A={a,b,c}
Set B={x,y}

选择许多可以用来得到下面的集合

{ (x,a) , (x,b) , (x,c) , (y,a) , (y,b) , (y,c) }

注意,这里我们取集合A和集合B中的元素的所有可能组合。

下面是一个你可以尝试的LINQ示例

List<string> animals = new List<string>() { "cat", "dog", "donkey" };
List<int> number = new List<int>() { 10, 20 };

var mix = number.SelectMany(num => animals, (n, a) => new { n, a });

混合将有以下元素在平面结构,如

{(10,cat), (10,dog), (10,donkey), (20,cat), (20,dog), (20,donkey)}

其他回答

Select是一个简单的从源元素到结果元素的一对一投影。选择- - - 当查询表达式中有多个from子句时使用Many:原始序列中的每个元素都用于生成一个新序列。

Select many就像SQL中的交叉连接操作,它需要叉乘。 例如,如果我们有

Set A={a,b,c}
Set B={x,y}

选择许多可以用来得到下面的集合

{ (x,a) , (x,b) , (x,c) , (y,a) , (y,b) , (y,c) }

注意,这里我们取集合A和集合B中的元素的所有可能组合。

下面是一个你可以尝试的LINQ示例

List<string> animals = new List<string>() { "cat", "dog", "donkey" };
List<int> number = new List<int>() { 10, 20 };

var mix = number.SelectMany(num => animals, (n, a) => new { n, a });

混合将有以下元素在平面结构,如

{(10,cat), (10,dog), (10,donkey), (20,cat), (20,dog), (20,donkey)}

select操作符用于从集合中选择值,SelectMany操作符用于从集合的集合(即嵌套集合)中选择值。

再举一个如何使用SelectMany + Select来累积子数组对象数据的例子。

假设我们有一些带着手机的用户:

class Phone { 
    public string BasePart = "555-xxx-xxx"; 
}

class User { 
    public string Name = "Xxxxx";
    public List<Phone> Phones; 
}

现在我们需要选择所有用户的所有手机的basepart:

var usersArray = new List<User>(); // array of arrays
List<string> allBaseParts = usersArray.SelectMany(ua => ua.Phones).Select(p => p.BasePart).ToList();

没有太多的技术-数据库与许多组织,每个有许多用户:-

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表。