获取数组linq中的多个字段

本文关键字:字段 数组 linq 获取 | 更新日期: 2023-09-27 17:58:07

在我的应用程序中,一个用户可以有多个位置。我想在下拉列表中显示用户的所有位置。我创建了一个具有两个字段UserIDLocations的模型。位置是字符串数组。我想要一个Linq查询来获取UserID和它们的Locations。在林克有可能吗?

public partial class ModelLocation
{
    public int UserID { get; set; }      
    public string[] Locations{ get; set; }
}

在我的数据库中,记录就像

UserID   Location
1           A
1           B
2           A
3           B
3           C
3           D

获取数组linq中的多个字段

var models = db.Locations.GroupBy(l => l.UserId)
.Select(l => new ModelLocation() 
{ 
  UserID = l.Key, 
  Locations = l.Select(l => l.Location).ToArray() 
});

根据您使用的linq引擎(linq-to-sql,linq-to-entities),查询可能会获得非常糟糕的性能,并导致多个查询被发送到数据库。解决这个问题的一种方法是首先从DB中检索数据,然后通过引入对AsEnumerable()的调用在内存中执行分组。

var models = db.Locations.AsEnumerable().GroupBy(l => l.UserId)
.Select(l => new ModelLocation() 
{ 
  UserID = l.Key, 
  Locations = l.Select(l => l.Location).ToArray() 
});

如果您想使用Where()进行任何筛选,则应在调用AsEnumerable()以在DB中完成筛选之前执行

您可以使用.SelectMany()来实现这样的输出:

var locations = modelLocations.SelectMany(x => x.Select(location => new { x.UserID, location }));

试试这个:

var query = db.UserLocations
            .GroupBy(l => l.UserID)
            .Select(g =>
                     new ModelLocation
                            {
                               UserID = g.Key,
                               Locations = g.Select(l => l.Location).ToArray()
                            });
// these are the raw db objects
List<Record> records = new List<Record>();
var modelLocations = records.GroupBy(i => i.UserID).Select(g => new ModelLocation {
    UserID = g.Key,
    Locations = g.Select(j => j.Location).ToArray()
});