【问题标题】:Linq Lambda groupby and projection problemLinq Lambda groupby 和投影问题
【发布时间】:2010-11-15 07:09:42
【问题描述】:

如果我有一些数据,例如: 型号型号名称代码 阿瑞斯 1.2 1 阿瑞斯 1.3 2 卡罗拉 1.1 3 卡罗拉 1.4 4

我想创建一个带有新投影的 groupby 查询,例如:

var vehicles = _vehicleRepository.GroupBy(x=>new {x.Model,x.ModelName,x.Code})
                    .Select(g => new { Text = g.Key.Model + " - " + g.Key.ModelName, g.Key.Code })
                    .ToList();

我似乎在使用 Text = g.Key.Model + " - " + g.Key.ModelName 时遇到了困难,它会导致 SQL 错误

感谢任何提示

【问题讨论】:

  • 什么这会导致 SQL 错误?
  • 它是否会导致 SQL 错误,或者是否会导致客户端出现关于无法转换为 SQL 或其他相关但与执行查询错误无关的异常?有很大的不同。
  • SQL 错误。问题似乎出在生成的 SQL 上

标签: linq lambda


【解决方案1】:

最简单的解决方法可能是在客户端执行连接:

var vehicles = _vehicleRepository.GroupBy(x => new {x.Model,x.ModelName,x.Code})
                .Select(g => g.Key)
                .AsEnumerable()
                .Select(k => new { Text = k.Model + " - " + k.ModelName, 
                                   k.Code })
                .ToList();

这里的AsEnumerable 有效地使查询的其余部分只在调用站点上运行,在.NET 中。我添加了一个额外的投影以从每个组中获取密钥,这样就不会传输不必要的数据。

另一种选择可能是使用Distinct

var vehicles = _vehicleRepository.Select(x => new {x.Model,x.ModelName,x.Code})
                .Distinct()
                .AsEnumerable()
                .Select(k => new { Text = k.Model + " - " + k.ModelName, 
                                   k.Code })
                .ToList();

您可能不需要在此处调用AsEnumerable - 您当然可以尝试删除它。

【讨论】:

  • 感谢 Jon 的回复,但无法让它们运行。
  • 据我所知,您的 AsEnumerable() 会获取所有数据,这是真的吗?如果是,最好不使用 linq 运行存储过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多