Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数据库中选择多个列_C#_Sql Server_Entity Framework - Fatal编程技术网

C# 从数据库中选择多个列

C# 从数据库中选择多个列,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我想从数据库中选择三列(用户名、浏览器和浏览器版本),但当我使用第一个变量时,我会为每个用户获得多个结果。我只希望每个用户使用一次他使用的浏览器。使用第二个变量,我只获取一次用户,但不使用浏览器 var browserUser = db.Tracking.Include(t => t.Users).ToList(); var browserUserFiltered = browserUser.GroupBy(x => x.userIdFk).Select(g => g.Firs

我想从数据库中选择三列(用户名、浏览器和浏览器版本),但当我使用第一个变量时,我会为每个用户获得多个结果。我只希望每个用户使用一次他使用的浏览器。使用第二个变量,我只获取一次用户,但不使用浏览器

var browserUser = db.Tracking.Include(t => t.Users).ToList();
var browserUserFiltered = browserUser.GroupBy(x => x.userIdFk).Select(g => g.First());

实际输出的屏幕截图
数据库模型

尝试按FirstOrDefault选择浏览器和browserVersion:

var browserUserFiltered = browserUser.GroupBy(x => x.userIdFk).Select(g => new { 
username= g.FirstOrDefault().username,
browser= g.FirstOrDefault().browser,
browserVersion= g.FirstOrDefault().browserVersion,
});

因此,您有
用户序列
跟踪序列
。每个
用户
都有零个或多个
跟踪
,每个
跟踪
都只属于一个
用户
,使用外键
UserIdFk
。直接的一对多关系

User                Tracking
Id | Name           Id | UserIdFk | <other properties>
 1 | Jan            10 |    1     | A
 2 | Piert          11 |    1     | B
                    12 |    2     | C

var browserUser = db.Tracking.Include(t => t.Users).ToList();
请执行GroupBy:

var browserUserFiltered = browserUser.GroupBy(x => x.userIdFk)
.Select(g => g.First());
结果:2个I组的序列

Group Key: 1; Elements:
      Tracking: Id = 10, UserIdFk = 1; User: Id = 1; Name = Jan
      Tracking: Id = 11, UserIdFk = 1; User: Id = 1; Name = Jan
Group Key: 2; Elements:
      Tracking: Id = 12, UserIdFk = 2; User: Id = 2, Name = Piert
在GroupBy之后继续:

var browserUserFiltered = browserUser.GroupBy(x => x.userIdFk)
.Select(g => g.First());
结果:两个项目的顺序,每组一个项目:

Tracking: Id = 10, UserIdFk = 1; User: Id = 1; Name = Jan
Tracking: Id = 12, UserIdFk = 2; User: Id = 2, Name = Piert
问题:为什么您认为结果中只有一项?


在一对多模式中,您可以选择两种方式:

  • 获取用户的跟踪信息,这意味着在内部完成组加入。每个用户都会准确地传输到您的流程中一次。没有跟踪数据的用户也在结果中
  • 获取跟踪,每个跟踪都有其用户。内部连接完成。如果一个用户有多个跟踪,同一用户数据将被发送多次。没有任何跟踪数据的用户根本不被提及
由你决定你想要什么

使用选择而不是包含 数据库查询中较慢的部分之一是将所选数据传输到进程。因此,限制所选数据量是明智的

如果用户4有1000个跟踪,那么每个跟踪将有一个外键UserId,其值等于4。如果使用Include选择数据,相同的外键值将被发送1000次,而您已经知道它等于用户主键的值:4。真是浪费

查询数据时,请始终使用“选择”,并仅选择实际计划使用的属性。仅当计划更新包含的项目时才使用“包含”

因此,要获取具有(部分)跟踪的某些用户,请执行以下查询:

var result = dbContext.Users
    .Where(user => ...)              // only if you don't want all Users
    .Select(user => new
    {
        // Select only the User data you actually plan to use
        Id = user.Id,
        Name = user.Name,
        ...

        Trackings = user.Trackings
            .Where(tracking => tracking.Date >= startDate) // only if you don't want all Trackings
            .Select(tracking => new
            {
                 // again: select only the properties you plan to use
                 Id = tracking.Id,
                 Name = tracking.Name,
                 ...
                 // not needed, you know the value: UserId = tracking.UserId
            })
            .ToList(),
    });

从npm安装morelinq,然后使用
users.DistinctBy(u=>userId.ToList()


使用SelectMany var browserUserFiltered=browserUser.GroupBy(x=>x.userIdFk)。SelectMany(g=>g.First());请共享跟踪、用户表和所需输出的列。我添加了数据库模型。我想要的输出类似于user1,Chrome,Version xxx-->这在我的数据库中,我想在我的asp.net页面的表格中显示它。@SmightyM8 asp.net是一个web堆栈,不是ORM或数据访问技术。代码执行您告诉它的操作—加载所有跟踪行和所有相关用户。如果您想让用户使用浏览器,您应该从
db.users
和任何相关的跟踪行开始。谢谢,现在我得到了预期的结果。我尝试了这个方法,但得到了一个类型错误。传递到字典的模型元素的类型为“System.Linq.Enumerable+WhereSelectEnumerableInterator
2[System.Linq.iGroup
2[System.Int32,WebApp.Models.Tracking],f_uAnonymousType1
3[WebApp.Models.Users,System.String,System.String]”。但是,此词典需要类型为“System.Collections.Generic.IEnumerable
1[WebApp.Models.Tracking]”的模型元素。谢谢,我已经用类似于您的解决方案解决了它。