【问题标题】:Map sql query with EF query doesn't work使用 EF 查询映射 sql 查询不起作用
【发布时间】:2014-12-29 19:43:45
【问题描述】:

我正在尝试使用 EF6 执行查询。我的 sql 格式查询是这样的:

/****** Script for SelectTopNRows command from SSMS  ******/
SELECT 
      [SUBJECT],COUNT(SUBJECT)

  FROM [PGC].[dbo].[QC] group by [SUBJECT]

效果很好。

主题是字符串类型。

但我将查询翻译为 EF,如您在此处看到的:

 listDataSource =
                db.QCs.Where(j => j.SUBJECT != null).ToList().GroupBy(i => new {i.SUBJECT}).Select(m => new chart()
                    {
                        date = m.Key.SUBJECT,
                        Count = m.Count(i=>i.SUBJECT).ToString()
                    }).ToList();

m.Count(i=>i.SUBJECT) 返回错误:can't convert expression type string to return type bool

最好的问候

【问题讨论】:

  • 您的 SUBJECT 字段是字符串,您不能计算字符串,只能计算布尔表达式。它等同于 .Where(i => {some boolean expression}).Count()
  • 我的问题是,如果不可能,为什么sql可以计算它?
  • 因为 LINQ 不直接转换为 SQL,反之亦然。在一个中完全有效的表达式在另一个中没有任何意义。这就是 LINQ 的主要罪过:它看起来像 SQL,行为不同,它的真正本质是数据流的功能处理(通过称为 map、filter、flatMap 等的方法)。如果您真的想知道您的 LINQ 如何转换为 SQL,请使用 LinqPad

标签: c# mysql sql-server entity-framework


【解决方案1】:

扩展 Yuriy 的答案(这是完全可以接受的),并进行了一些修复,主要是为了性能:

listDataSource = db.QCs
    .Where(j => j.SUBJECT != null)
    .GroupBy(i => i.SUBJECT) //no need to create an anonymous type, you don't use it afterwards
    .Select(group => new { SUBJECT = group.Key, Count = group.Count()}) //counting in SQL is faster
    .AsEnumerable() //materialization, all the heavy lifting is performed by SQL until now
    .Select(value => //seems redundant, but the previous selection just translates into an SQL select statement with SUBJECT and Count columns
        new chart
        {
            date = value.SUBJECT,
            Count = value.Count.ToString()
        })
    .ToList();

【讨论】:

    【解决方案2】:

    你不应该使用Count<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>),因为它:

    返回一个数字,表示指定序列中有多少元素满足条件。Source

    i=>i.SUBJECTFunc<TSource, String>,但该方法需要 Func<TSource, Boolean>,这就是您收到该异常消息的原因。

    改为使用Count<TSource>(IEnumerable<TSource>),它将返回序列中元素的总数,例如:

     Count = m.Count().ToString()
    

    【讨论】:

    • 所以我不需要按顺序排列的总数,我需要按我的主题列分组的总数
    • @EA,您的变量 m 是一个 IGrouping,在其上调用 Count() 只会为您提供该组中的项目数。
    • 这就是你得到的,一旦你在 GroupBy 之后,你就会计算单个组中的项目数
    • 我做到了,它给了我列表的总数
    猜你喜欢
    • 2017-06-16
    • 2013-11-15
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多