我有一个linq to sql查询返回一些非零余额的订单(实际上,查询有点复杂,但为了简单起见,我省略了一些细节).此查询还应返回没有CardItems的订单(两个子查询在T-SQL中都返回NULL,并且比较两个NULLS给出FALSE,因此我将子查询的NULL结果值转换为0以进行比较).
var q = (from o in db.Orders
where db.Cards(p =>
p.OrderId == o.Id
&& p.Sum + (db.CardItems.Where(i => i.IncomeId == p.Id)
.Sum(i => (double?)i.Amount) ?? 0)
!= (db.CardItems.Where(i => i.DeductId == p.Id)
.Sum(i => (double?)i.Amount) ?? 0)
).Any()
select o);
Run Code Online (Sandbox Code Playgroud)
问题是,转换表达式Sum(i =>(double?)i.Amount)?? 0 生成COALESCE运算符,由于其中的子查询,它比完全相同的T-SQL查询慢十倍,并且替换了COALESCE到ISNULL.在这种情况下是否有可能生成ISNULL?
在使用Linq-to-SQL和WCF服务开发n层应用程序时,我对最佳实践感到好奇.
特别是,我很感兴趣,例如,如何从两个相关表返回表示层数据.假设下一个情况(大大简化):
数据库有表:
Orders
(id, OrderName
)OrderDetails
(id, orderid, DetailName
)中间层有CRUD方法OrderDetails
.所以,我需要有办法重建实体以附加到更新的上下文或从表示层返回时插入.
在表示层我需要显示OrderDetails
与OrderName
父表对应的列表.
从服务返回的类有两种方法:
使用DTO自定义类来封装来自表和投影的数据:
class OrderDetailDTO
{
public int Id { get; set; }
public string DetailName { get; set; }
public string OrderName { get; set; }
}
IEnumerable<OrderDetailDTO> GetOrderDetails()
{
var db = new LinqDataContext();
return (from od in db.OrderDetails
select new OrderDetailDTO
{
Id = od.id,
DetailName = od.DetailName,
OrderName = od.Order.OrderName
}).ToList();
}
Run Code Online (Sandbox Code Playgroud)
缺点:需要以两种方式分配对表示层很重要的每个字段(当返回数据时和创建新实体以附加到上下文时,当数据从表示层返回时) …