4

我有一个成功执行的 linq 查询,返回的列之一是十进制类型,用于表示以英镑和便士为单位的价格(永远不会有任何负值)

我希望能够将英镑和便士剥离到我的投影的单独属性中,但是当使用诸如

var result= from j in context.Products

 select
   new{
     Price = t.Price,                                                     
     PricePounds = Math.Truncate(t.Price)
   };

我收到一个错误,即 Math.truncate 不受支持,因为它无法转换为存储表达式。如何从此查询中获取磅值?

4

2 回答 2

4

如果之后您不需要在数据库中执行任何其他操作,最简单的方法就是执行截断客户端:

var query = context.Products
                   .AsEnumerable() // Everything from here is LINQ to Objects
                   .Select(p => new {
                               p.Price,
                               PricePounds = Math.Truncate(p.Price)
                           });

请注意,您可能还想强制转换为int-可能已经在 EF 中得到支持。

编辑:如评论中所述,您可能希望先执行投影,例如

var query = context.Products
                   .Select(p => new { p.Price, p.SomethingElse })
                   .AsEnumerable() // Everything from here is LINQ to Objects
                   .Select(p => new {
                               p.Price,
                               PricePounds = Math.Truncate(p.Price),
                               p.SomethingElse
                           });

SomethingElse例如,您感兴趣的另一处房产在哪里 - 我怀疑您想要价格。)

当您只需要几个属性时,这将避免获取整个实体。

于 2012-09-04T16:12:18.170 回答
4

你可以试试:

var result= from j in context.Products
select
  new {
       Price = t.Price,                                                     
       PricePounds = EntityFunctions.Truncate(t.Price, 0)
      };

情况是 Math.Truncate 不能被翻译成 EntityFunctions.Truncate 应该是的 SQL。

于 2012-09-04T16:20:42.537 回答