简体   繁体   English

Lambda LINQ 查询带有多个 from 子句

[英]Lambda LINQ query with multiple from clauses

I've got this query我有这个查询

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
                   };

where daysOfWeek is an enum array.其中daysOfWeek是一个枚举数组。

private readonly DayOfWeek[] daysOfWeek = new DayOfWeek[]
{
    DayOfWeek.Sunday,
    DayOfWeek.Monday,
    DayOfWeek.Tuesday,
    DayOfWeek.Wednesday,
    DayOfWeek.Thursday,
    DayOfWeek.Friday,
    DayOfWeek.Saturday
};

so, I need to convert this query sintax to lamda expression.所以,我需要将此查询 sintax 转换为 lamda 表达式。 I try with this, but its wrong:(我试试这个,但它错了:(

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
                            }));

The page you want to look at is here:您要查看的页面在这里:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions

It's a lot of text.这是很多文字。 The bit you want specifically is:你特别想要的是:

A query expression with a second from clause followed by a select clause带有第二个 from 子句的查询表达式,后跟 select 子句

from x1 in e1
from x2 in e2
select v

is translated into被翻译成

( e1 ) . SelectMany( x1 => e2 , ( x1 , x2 ) => v )

Let's apply that to your example:让我们将其应用于您的示例:

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
};
  • x1 is g x1g
  • e1 is repository.SpeedGoalsRepository.DbSet.Where(e => e.ID == null) . e1repository.SpeedGoalsRepository.DbSet.Where(e => e.ID == null)
  • x2 is d x2d
  • e2 is daysOfWeek e2daysOfWeek
  • v is new myObject... vnew myObject...

So put it all together:所以把它们放在一起:

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

and we're done.我们完成了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM