代码之家  ›  专栏  ›  技术社区  ›  Alan2

如何使用LINQ将.Where添加到.Select中?

  •  1
  • Alan2  · 技术社区  · 5 年前

    我正在使用一个LINQ查询。我想做的是把数据 Start 然后根据检索到的行是否将IsAndroid或IsIos设置为true,选择AndroidSpeeds或IOSSpeeds的数据。

    以下是我迄今为止的疑问:

    List<LogStart> Start1 = Start
        .Where(x => x.IsPhysical == true)
        .OrderBy(g => g.DateYYMMDD)
        .Select(g => new Start2
        {
            AndroidDBSpeed = (int?)g.Where(gx => gx.IsAndroid).Select(gx => (int?)gx.DBSpeed).DefaultIfEmpty(),
            AndroidCPUSpeed = (int?)g.Where(gx => gx.IsAndroid).Select(gx => (int?)gx.CPUSpeed).DefaultIfEmpty(),
            IOSDBSpeed = (int?)g.Where(gx => gx.IsIos).Select(gx => (int?)gx.DBSpeed).DefaultIfEmpty(),
            IOSCPUSpeed = (int?)g.Where(gx => gx.IsIos).Select(gx => (int?)gx.CPUSpeed).DefaultIfEmpty(),
        })
        .ToList();
    

    但是,有一个问题。它指向。在哪说的

    Program.cs(46,46):错误CS1061:“LogStart”不包含 “Where”和无可访问扩展方法“Where”的定义 可以找到接受“LogStart”类型的第一个参数(您是

    有没有人知道可能出了什么问题以及如何解决?

    供参考 ,同一文件中的以下语句可以正常工作:

       List<LogStart> Start2 = Start
            .Where(x => x.IsPhysical == true)
            .GroupBy(x => x.DateYYMMDD)
            .OrderBy(g => g.Key)
            .Select(g => new Start2
            {
                DateYYMMDD = g.Key,
                Devices = g.Count(),
                AndroidDBSpeed = (int?) g.Where(gx => gx.IsAndroid).Select(gx => (int?) gx.DBSpeed).DefaultIfEmpty().Average(),
                AndroidCPUSpeed = (int?)g.Where(gx => gx.IsAndroid).Select(gx => (int?)gx.CPUSpeed).DefaultIfEmpty().Average(),
                IOSDBSpeed = (int?)g.Where(gx => gx.IsIos).Select(gx => (int?)gx.DBSpeed).DefaultIfEmpty().Average(),
                IOSCPUSpeed = (int?)g.Where(gx => gx.IsIos).Select(gx => (int?)gx.CPUSpeed).DefaultIfEmpty().Average(),
            })
            .ToList();
    
    3 回复  |  直到 5 年前
        1
  •  3
  •   sgmoore    5 年前

    分组是第二个工作的基础。

    如果你不想分组的话,我想你是在找

    var Start1 = Start
    .Where(x => x.IsPhysical == true)
    .OrderBy(g => g.DateYYMMDD)
    .Select(g => new Start2
    {
        AndroidDBSpeed  = g.IsAndroid ? (int?) g.DBSpeed :  (int?) null,
        AndroidCPUSpeed = g.IsAndroid ? (int?) g.CPUSpeed : (int?) null,
        IOSDBSpeed      = gx.IsIos    ? (int?) g.DBSpeed  : (int?) null,
        IOSCPUSpeed     = gx.IsIos    ? (int?) g.CPUSpeed : (int?) null,
    })
    .ToList();
    
        2
  •  0
  •   TomTom    5 年前

    显然Start必须是LINQ支持的类型。

        3
  •  0
  •   Clint    5 年前
    using System.Linq //Add this to the namespace, if you have not added
    

    Where , Select GroupBy 等等,这些被称为扩展方法。 为了使用这些扩展方法,您需要添加 System.Linq System.Core 提供对支持使用语言集成查询的查询的类的访问的程序集

    Program.cs(46,46):错误CS1061:“LogStart”不包含 可以找到接受“LogStart”类型的第一个参数(您是 缺少using指令或程序集引用?)(CS1061)(宇宙)

    : 从随后的更新

    在哪里? 子句,您需要确保类型实现 在这条线上 g.Where(gx => gx.IsAndroid). g 属于类型 LogStart 不执行 不可数 因此你不能使用 在哪里?

    请注意我的评论,下一个c#声明 文件工作得很好。

    因为你在做 收藏 (int?) g.Where(gx => gx.IsAndroid) g是类型 IGrouping

    要解决这个问题,您可以尝试使用原始代码 Cast<IEnumberable> 然后使用 .Where

    List<LogStart> Start1 = Start
        .Where(x => x.IsPhysical == true)
        .OrderBy(g => g.DateYYMMDD).Cast<IEnumerable<LogStart>>()
        List<LogStart> Start1 = Start
        .Where(x => x.IsPhysical == true)
        .OrderBy(g => g.DateYYMMDD).Cast<IEnumerable<LogStart>>()
       .Select(g => new Start2
        {
            AndroidDBSpeed = (int?)g.Where(gx => gx.IsAndroid).Select(gx => (int?)gx.DBSpeed).DefaultIfEmpty(),
            AndroidCPUSpeed = (int?)g.Where(gx => gx.IsAndroid).Select(gx => (int?)gx.CPUSpeed).DefaultIfEmpty(),
            IOSDBSpeed = (int?)g.Where(gx => gx.IsIos).Select(gx => (int?)gx.DBSpeed).DefaultIfEmpty(),
            IOSCPUSpeed = (int?)g.Where(gx => gx.IsIos).Select(gx => (int?)gx.CPUSpeed).DefaultIfEmpty(),
        })
        .ToList();