具有多个from子句的Lambda LINQ查询

Mak*_*ito 1 c# linq

我有这个查询

var myobjectList = from g in repository.SpeedGoalsRepository.DbSet.Where(e => e.ID == null)
                   from d in daysOfWeek
                   select new myObject
                   {
                     DayID = (short?)d,
                     GoalA = g.GoalA,
                     GoalB = g.GoalB
                   };
Run Code Online (Sandbox Code Playgroud)

daysOfWeek枚举数组在哪里。

private readonly DayOfWeek[] daysOfWeek = new DayOfWeek[]
{
    DayOfWeek.Sunday,
    DayOfWeek.Monday,
    DayOfWeek.Tuesday,
    DayOfWeek.Wednesday,
    DayOfWeek.Thursday,
    DayOfWeek.Friday,
    DayOfWeek.Saturday
};
Run Code Online (Sandbox Code Playgroud)

因此,我需要将此查询sintax转换为lamda表达式。我尝试这样做,但是它是错误的:(

var defaultSpeedGoals= repository.SpeedGoalsRepository.DbSet.Where(e => e.ID == null);
var myobjectList = SpeedGoals.Cast<SpeedGoalsRepository>()
                            .SelectMany(g => g.DbSet.Cast<DayOfWeek>().Select(sg => new myObject
                            {
                                DayID = (short?)sg,
                                GoalA= g.DbSet.FirstOrDefault().GoalA,
                                GoalB = g.DbSet.FirstOrDefault().GoalB
                            }));
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 10

您要查看的页面在这里:

https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/language-specification/expressions

有很多文字。您想要的具体位是:

具有第二个from子句和一个select子句的查询表达式

from x1 in e1
from x2 in e2
select v
Run Code Online (Sandbox Code Playgroud)

被翻译成

( e1 ) . SelectMany( x1 => e2 , ( x1 , x2 ) => v )
Run Code Online (Sandbox Code Playgroud)

让我们将其应用于您的示例:

from g in repository.SpeedGoalsRepository.DbSet.Where(e => e.ID == null)
from d in daysOfWeek
select new myObject
{
  DayID = (short?)d,
  GoalA = g.GoalA,
  GoalB = g.GoalB
};
Run Code Online (Sandbox Code Playgroud)
  • x1g
  • e1repository.SpeedGoalsRepository.DbSet.Where(e => e.ID == null)
  • x2d
  • e2daysOfWeek
  • vnew myObject ...

所以放在一起:

repository.SpeedGoalsRepository.DbSet
  .Where(e => e.ID == null) 
  .SelectMany(
    g => daysOfWeek, 
    (g, d) => new myObject { ... } )
Run Code Online (Sandbox Code Playgroud)

我们完成了。