同样的语句换个方式就可以,否则就会报错,为什么?

lovebaby 2015-09-11 02:00:21
如下语句是根据不同会员级别的折扣计算购物车的商品价格总计,其中login.UserLevel.getPrice(p.Price)是一个自定义方法,该方法可以根据商品原来单价计算折后单价。
var list = (from p in ctx.mf_Product
join c in ctx.mf_Cart
on p.ProductID equals c.ProductID
select new { Price = login.UserLevel.getPrice(p.Price) * c.BuyCount }).ToList();
decimal total = list.Sum(s => s.Price);
Response.Write(total);

上面的语句执行会报错,错误如下:
无法将表达式“Table(mf_Product).Join(Table(mf_Cart), p => p.ProductID, c => c.ProductID, (p, c) => new <>f__AnonymousType6`1(Price = (Invoke(value(System.Func`1[LevelHelper])).getPrice(p.Price) * Convert(c.BuyCount))))”转换为 SQL 并且无法将它视为局部表达式。


但是换一种方式,先把数据获取出来,再通过lambda去计算,就没有问题。如下:
var list = (from p in ctx.mf_Product
join c in ctx.mf_Cart
on p.ProductID equals c.ProductID
select new { Price = p.Price,BuyCount = c.BuyCount }).ToList();
decimal total = list.Sum(s => login.UserLevel.getPrice(s.Price) * s.BuyCount);
Response.Write(total);


我是想知道为什么第一种方法就不行呢,为什么不能直接在linq语句中直接进行乘法计算呢?
...全文
148 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovebaby 2015-09-11
  • 打赏
  • 举报
回复
以下代码用了let,但还是不能做计算。
var list = (from p in ctx.mf_Product
                    join c in ctx.mf_Cart
                    on p.ProductID equals c.ProductID
                    let Price = login.UserLevel.getPrice(p.Price)
                    select new { Price = Price * c.BuyCount }).ToList();         //如果不进行乘法计算,是可以foreach出数据的。
        foreach (var s in list)
        {
            Response.Write(s.Price + "<br>");
        }
login是我一个自定义获取单价的方法。
public decimal getPriceForName(string UserName, decimal Price)
    {
        return Price * (from p in ctx.mf_UserLevel orderby p.Lower where getUser(UserName).Amount >= p.Lower && getUser(UserName).Amount < p.Upper select p).Take(1).First().Discount / 100;
    }
岁月如刀 2015-09-11
  • 打赏
  • 举报
回复
1楼已经回答了楼主,
exception92 2015-09-11
  • 打赏
  • 举报
回复
login 是什么? 使用let 关键字 先把Price 查出来,类似:

 on p.ProductID equals c.ProductID
 let price = login.UserLevel.getPrice(p.Price)
  • 打赏
  • 举报
回复
LinqToSQL和LinqToEF本质一样,都是要转化成SQL的
lovebaby 2015-09-11
  • 打赏
  • 举报
回复
小白一下,是不是只要用LINQ to SQL就和EF有关啊
lovebaby 2015-09-11
  • 打赏
  • 举报
回复
我没用EF,就是普通的asp.net形式用的linq
  • 打赏
  • 举报
回复
你在写LinqToEF里,因为EF最终要转成SQL,而你写的方法肯定不可能被EF支持 而第二种写法就是LinqToObject,这是内存操作,数据都在内存里,只要能写出来,都能执行出来

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧