【问题标题】:Linq Where/OrderBy string to intLinq Where/OrderBy string to int
【发布时间】:2014-09-11 14:51:39
【问题描述】:

我在这里看到了类似的问题,但没有一个答案适用于我的 linq 查询。

我正在尝试将.ThenBy() 上的字符串转换为整数

dbResults = gaResultDetails.All
.Where(c => c.ContentLink.Id == contentId && c.RequestType.Id == requestTypeId)
.OrderBy(c => c.DateFrom)
.ThenBy(c => int.Parse(c.Data_2)).Take(Take).ToList();

请注意,我使用 nHibernate 进行数据访问,使用上述表达式会出现以下错误:

[NotSupportedException: Int32 Parse(System.String)]

救命!

【问题讨论】:

  • gaResultDetails.All 返回什么?
  • 我认为的问题是 NHibernate 不支持在 order 方法中进行这种转换。

标签: c# .net linq nhibernate


【解决方案1】:

nhibernate linq 表达式生成器不支持某些函数,试试这个:

dbResults = gaResultDetails.All
  .Where(c => c.ContentLink.Id == contentId && c.RequestType.Id == requestTypeId)    
  .AsEnumerable()
  .OrderBy(c => c.DateFrom)
  .ThenBy(c => int.Parse(c.Data_2))
  .Take(Take) 
  .ToList();

在性能方面可能不是理想的,但应该可以满足您的需求。

【讨论】:

  • 你可以使用AsEnumerable()而不是ToArray()来避免分配额外的数组。
  • @mxmissile 完美!该查询只返回一个非常小的数据集,因此在这种情况下的性能不应该导致问题,但在未来应该牢记这一点。谢谢
  • 这是一个解决方案,但效果不好。 AsEnumerable()ToList() 等方法在内存中提供所有结果,并且 order 和 take 将在内存中执行,而不是仅在查询时 Take(Take) 值中的结果。
  • @FelipeOriani 正确 Take 受 nhibernate 支持,并且已修复。
  • 仍然没有提供 OP 想要的解决方案,因为订单只会在内存中获取结果的值,鄙视 Order 方法可以提供的值。我认为这里的问题是如何在 ThenBy 方法中转换值。我认为 NHibernate 不支持它。
【解决方案2】:

这只是在黑暗中拍摄。如果解析在 ThenBy 中不起作用,它可能在 let 中不起作用,但值得一试。在 LINQ 语法中,因为我更喜欢它:

dbResults = (from c in gaResultDetails.All
             where c.ContentLink.Id == contentId 
              && c.RequestType.Id == requestTypeId
             let nData2 = int.Parse(c.Data_2)
             orderby c.DateFrom, nData2) 
           .Take(Take) 
           .ToList();

【讨论】:

    【解决方案3】:

    您的 ORM 似乎试图在 SQL 服务器端执行转换。 尝试在投射之前评估数据,例如:

    dbResults = gaResultDetails.All
    .Where(c => c.ContentLink.Id == contentId && c.RequestType.Id == requestTypeId)
    .OrderBy(c => c.DateFrom).ToList()
    .ThenBy(c => int.Parse(c.Data_2)).Take(Take).ToList();
    

    【讨论】:

    • 你不能在 IList 上调用 ThenBy()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2011-02-10
    相关资源
    最近更新 更多