【问题标题】:Translate t-sql query to LINQ (left join with subquery/nested right join)将 t-sql 查询转换为 LINQ(带子查询的左连接/嵌套右连接)
【发布时间】:2011-12-15 11:44:26
【问题描述】:

这是我设法编写的查询:

select *
from [Transaction] as t left join (ProductTransaction as pt right join Product as p on pt.productId = p.productId) on t.transactionId = pt.transactionId
                    left join (ReservationTransaction as rt right join Reservations as r on rt.reservationId = r.reservationId) on t.transactionId = rt.transactionId

到目前为止,我已经得到了类似的东西(没有嵌套的右连接),但我被卡住了。谁能帮我处理这些子查询/嵌套连接?

from t in dataContext.Transactions
                join pt in dataContext.ProductTransactions on t.transakcja_id equals pt.transactionId into pTransactions
                from pt in pTransactions.DefaultIfEmpty()
                join rt in dataContext.ReservationTransactions on t.transakcja_id equals rt.transactionId into rTransactions
                from rt in rTransactions.DefaultIfEmpty()

编辑: 好的,谢谢你的提示。我想要做的是将~5 个相关的实体(它们与外键连接)组合到一个表中。情况是我需要所有交易,但并非每笔交易都与产品或预订相关联。所以我不确定我是否能够使用简单的关联属性和比一个更多的查询来获得所有这些,还是我?也许我应该使用多个查询并且有我的胸部问题?

我上传了我正在处理的实体方案的屏幕截图。提前感谢您的建议。 part of db scheme

【问题讨论】:

  • 我可以告诉你的是,你最好用清晰的语言解释你的查询需要做什么,然后在 LINQ 中推理它,而不是尝试从 sql 中翻译它。 Joseph Albahari 在他的网站上解释了为什么尝试从 SQL 翻译是个坏主意。除此之外,如果这些表的 FK 设置正确,则无需加入任何内容,只需查询主表并浏览导航属性即可。

标签: c# .net sql tsql linq-to-sql


【解决方案1】:

在您的数据库中设置外键,您将不需要连接,您将访问具有类似关联属性的链接表(只是一个示例):

var transation = dataContact.Transations.First();

var price = transaction.ProductTransaction.Product.Price;

【讨论】:

  • 确实,从 sql 翻译是个坏主意。它们都有相同的共同点,即关系代数。然而,它在 LINQ 中的实现要好得多。所以最好找出查询应该返回什么并在 linq 中重新创建它。
  • 使用 linq 语法你有两个选择,查询语法 var q = from el in dataSource where el.prop == condition select new { /*your projection including navigation properties*/ }; 和 Enuerable extensions var q = dataSource.Where(x=>x.prop == condition).Select(x=> new {/*projection*/}).Skip(20).Take(20)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多