努力在Linq中获得此

比特损失

活跃成员
已加入
2016年12月10日
留言内容
35
编程经验
Beginner
我有一条已经检查过功能的SQL语句,因为这使我发疯:

C#:
SELECT Site.*, Job.*
FROM Site INNER JOIN Job ON Site.SiteID = Job.SiteID
ORDER BY BookingDate;

我试图在Linq中创建它(我说对了吗?)。就像是:

C#:
[COLOR=blue]var[/COLOR] siteHistory = [COLOR=blue]from[/COLOR] s [COLOR=blue]in[/COLOR] _context.Sites
          .Include(w => w.Job)
          .OrderBy(w=>w.Job.BookingDate)
          [COLOR=blue]select[/COLOR] s;

但是,当我创建此对象时,Intellisense无法在Job中找到BookingDate,并给了我漂亮的红色花体。很好,如果我想制作红色花体但对我尝试做的事情没有帮助。

为什么不做这项工作?

什么是正确的陈述?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
问题是您正在处理一对多关系,因此您不能简单地按相关职位的BookingDate来订购网站,因为至少从理论上讲,可能有多个关联的职位。在实践中可以有多个相关的工作吗?找不到相关的工作吗?

顺便说一句,您应该将上下文配置为对导航一对多关系的属性使用复数名称。这样,名称将是Jobs而不是Job,问题将更加明显。
 

比特损失

活跃成员
已加入
2016年12月10日
留言内容
35
编程经验
Beginner
问题是您正在处理一对多关系,因此您不能简单地按相关职位的BookingDate来订购网站,因为至少从理论上讲,可能有多个关联的职位。在实践中可以有多个相关的工作吗?找不到相关的工作吗?

顺便说一句,您应该将上下文配置为对导航一对多关系的属性使用复数名称。这样,名称将是Jobs而不是Job,问题将更加明显。

不是我正在尝试或打算做的。

我正在做的是我有多个工作的网站。

我想按预订日期顺序列出工作。 SQL语句正是这样做的。因此,当我在视图中将它们视为相关项目时,它们仅显示该站点最近的工作。

我似乎找不到合适的方法来做到这一点。
 

比特损失

活跃成员
已加入
2016年12月10日
留言内容
35
编程经验
Beginner
如果查询应该获得Jobs,那么为什么要获得Sites?您应该查询工作并包括站点,而不是相反。

我也这样想。这将适用于这一实例。但是,并非在所有需要执行此操作的情况下。

以下面的内容为例,它还需要按顺序显示作业列表。我不确定从作业表开始它是否可以工作。
C#:
[COLOR=blue]var[/COLOR] site = [COLOR=blue]await[/COLOR] _context.Sites
               .Include(w => w.Client)
               .Include(w => w.SiteType)
               .Include(w => w.WaterBodys)
               .Include(w => w.Job)
                   .AsNoTracking()
               .SingleOrDefaultAsync(m => m.SiteID == id);

这只是一个特定的实例。我可以想到数十个需要按集合中的字段排序的地方。

我将尝试将其反转,看看是否可以使它工作。只是大声地想知道。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
似乎给人的印象是,无论您要实现什么目的,您都应该能够以一种特定的方式检索数据并可以正常工作。现在不要理会这个概念。您需要针对每种特定情况编写适当的代码。如果需要在两种特定情况下显示不同的内容,则可能需要编写两个不同的查询。就是这样,仅此而已。没有"join them together"。您编写需要执行的代码。
我可以想到数十个需要按集合中的字段排序的地方。
好吧,那么您的想法就有问题了,因为那没有道理。假设您有一个Parent实体和一个Child实体,而Child拥有Number属性。一个父级具有两个相关的子实体,其数值分别为1和3,而另一个父级具有一个相关的子实体,其数值分别为2和3。第一家长必须在第二家长之前和之后都来。很有意思的是,您将按照他们的第一个孩子或最后一个孩子的编号对其进行排序,但这与您所说的有所不同。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
以下面的内容为例,它还需要按顺序显示作业列表。我不确定从作业表开始它是否可以工作。
C#:
[COLOR=blue]var[/COLOR] site = [COLOR=blue]await[/COLOR] _context.Sites
               .Include(w => w.Client)
               .Include(w => w.SiteType)
               .Include(w => w.WaterBodys)
               .Include(w => w.Job)
                   .AsNoTracking()
               .SingleOrDefaultAsync(m => m.SiteID == id);
首先,当明显选择“ s”时,为什么同时使用“ w”和“ m”来引用站点?这是引起混乱的好方法。

关于这个问题,我重复一遍,如果您的目的是显示Job实体,那么您应该查询Jobs,而不是Sites。如果您想要列出特定站点的所有作业以及所有其他相关数据,那么根据我的收集,查询将如下所示:
var jobs = await _context.Jobs
                         .Include(j => j.Site.Client)
                         .Include(j => j.Site.SiteType)
                         .Include(j => j.Site.WaterBodys)
                         .Where(j => j.Site.SiteID == id)
                         .AsNoTracking()
                         .ToListAsync();
 

比特损失

活跃成员
已加入
2016年12月10日
留言内容
35
编程经验
Beginner
这就是我想问的。

很难使您的大脑朝正确的方向前进。

我看到它的用途是多重的,是因为有一种情况,例如想看工作并查看所有相关的时间卡条目。或查看该站点并查看所有相关工作,无论水体或...以及从实际意义上来说又是很多又很多。这就是我的意思
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
使用SQL连接时,最终会得到一个结果集,其中每一行都包含两个表中的数据。在EF中,您不会处理离散实体。您的原始SQL查询将生成一个结果集,其中包含两个表中的列,并且Job表中的每个记录一行,而Site表中的相同数据可能有多个版本。使用EF,您可以从两个不同的方向处理查询。它可以以父母为中心或以孩子为中心。如果您这样做:
context.Parents.Include(p => p.Children)

那么您将获得父级实体的集合,其中每个父级都有相关的子级实体的集合。如果您这样做:
context.Children.Include(c => c.Parent)

那么您将获得一个Child实体的集合,其中每个Child都有一个相关的Parent实体。多个子对象可以引用同一父对象。

其中哪一个更合适取决于情况。您要向用户显示单个父实体吗?那么第一个选择就是要选择的那个。

事实是,您只能使用查询本身对根实体进行排序。这意味着第一个选项只能对父实体排序,而不能对子实体排序。如果要使用查询对子实体进行排序,则必须使用第二个选项。

因此,如果您有相互竞争的要求,即显示一个父级并对子级实体进行排序,该怎么办?解决方案是在查询后进行排序。您可以使用第一个查询来检索数据,然后可以在控制器或视图中对Child实体进行排序。在这种情况下,您将使用LINQ to Objects,而不是LINQ to Entities。它仍然是相同的OrderBy方法,但是底层的LINQ提供程序却不同。
 
最佳 底部