【问题标题】:How to make this simple SQL query into a Linq Statement?如何将这个简单的 SQL 查询变成 Linq 语句?
【发布时间】:2011-06-10 16:32:58
【问题描述】:

我有以下 SQL 语句,它正在遍历一个表并根据数据定义选择一组结果。从该组中,我得到该组修订版最高的单个结果。现在 SQL 已经很简单了,但是到目前为止,将它翻译成 Linq 并没有产生任何我可以使用的东西。有人可以帮忙吗?

select * from datasheet ds where ds.revisionnum = 
(select max(revisionnum) from datasheet where datadefinitionid = 34) 
       and ds.isparent = 1  -- is parent will be true for this query

这是我在绊倒之前对 Linq 语句的了解:

var query = from ds in context.DataSheets 
             where ds.IsParent == true 
             && ds.RevisionNum  --- ?????

提前致谢!

代码更新

摸索了一会儿,我们想到了这个:

var dataSheet = _dataSheetRepository.All.Where(
                            d => d.DataDefinitionID == i.ID &&
                            d.IsParent == true);

var currentDataSheet = (from ds in dataSheet
                        where (ds.RevisionNum == (from s in dataSheet select
                        s.RevisionNum).Max()) select ds).SingleOrDefault();

使用两个变量使我们能够缩小我们正在寻找的工作表集合,然后使用第二个变量的 linq 查询,我们能够缩小我们想要的那个集合的实际修订号。

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:

    试试类似的方法

    var query = from ds in context.DataSheets 
                 where ds.IsParent == true 
                 && ds.RevisionNum == context.DataSheets.Where(
                                      ds => ds.DataDefinitionId == 34).Max(
                                      ds => ds.RevisionNum)
    

    子查询也可以转换成 linq 表达式

    【讨论】:

    • 啊……每次看到布尔值与truefalse 进行核对时,我的眼睛都疼...
    • 实际上有时它使代码更具可读性。但是在这种情况下,我同意,这似乎是多余的。
    • 我想这是个人喜好,但通常它告诉我编写代码的人并不真正理解布尔表达式。
    • 出于同样的原因,布尔值是真假。它读起来更好,因此更容易/更快地理解。
    • 尽管我想说这段代码可以工作,但它对我的作用并不大。在我期望退回一件物品的情况下,我仍然收到很多物品。
    【解决方案2】:

    我可以推荐工具http://www.linqpad.net/

    它非常适合针对 sql 和 Odata Web 服务创建和测试 linq 表达式。

    【讨论】:

      猜你喜欢
      • 2014-03-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
      相关资源
      最近更新 更多