【问题标题】:Help with Subsonic3 ActiveRecord LINQ query帮助 Subsonic3 ActiveRecord LINQ 查询
【发布时间】:2010-06-09 23:47:12
【问题描述】:

我有以下亚音速实体

TInvoiceHeader
TAccountAssociation

如何在 LINQ(亚音速)中实现以下目标

SELECT * from TInvoiceHeader
WHERE custid IN 
  (SELECT custid FROM TAccountAssociation
     WHERE username = 'a')

我需要将结果绑定到 GridView。

更新:我试过了

Dim accounts As List(Of TAccountAssociation) = _
TAccountAssociation.Find(Function(x) x.UserName = "a")

        GridView1.DataSource = TInvoiceHeader.All() _
             .Where(Function(x) accounts.Contains(x.custID))
        GridView1.DataBind() 

但我收到一个错误“...嵌套函数与委托的签名不同”

更新:

我真的不明白这个......

why does this work

        Dim accounts() As String = {"N12345", "A12455"}


        GridView1.DataSource = TInvoiceHeader.All(). _
Where(Function(c) accounts.Contains(c.custID))
        GridView1.DataBind()

但这不是

Dim accounts  = TAccountAssociation.Find(Function(x) x.UserName = "a")

        GridView1.DataSource = TInvoiceHeader.All(). _
Where(Function(c) accounts.Contains(c.custID))
        GridView1.DataBind()

更新

我最终使用了 Fluent Query

GridView1.DataSource = New customerWEBDB().Select.From(Of TInvoiceHeader)_
              .Where("custID") _
              .In(New customerWEBDB().SelectColumns("custID") _
              .From(Of TAccountAssociation) _
              .Where("UserName").IsEqualTo("aaa")) _
              .ExecuteTypedList(Of TInvoiceHeader)()

 GridView1.DataBind()

希望有人能给我展示更好的东西。

【问题讨论】:

  • 您在为您的实体使用 ActiveRecord 或 Repository 模式吗?
  • 我正在使用 ActiveRecord。
  • 我就是想不通....有人吗?
  • 我发现运行 subsonics TT 文件非常简单,对于任何类型的表连接,最好创建视图,它将数据库特定代码保留在数据库中,然后您可以从像查看表格一样查看 KIS

标签: c# vb.net linq subsonic3


【解决方案1】:

查看this 101 linq 示例。这里有一些很棒的东西。 还请阅读 Scott Gu 的 blog - 示例使用的是 Linq to SQL,但 LINQ 的内容应该非常相似。

你可以这样做:

var query = (from IH in db.TInvoiceHeader
              join AA in db.TAccountAssociation on 
               IH.custid equals AA.custid
              where aa.username.equals("a")
              select ID).ToList();

只要 ID.custid 和 aa.custid 是同一类型(并且都可以为空或不可为空),这将起作用。如果不是这种情况,您将需要这样的东西:

var query = (from IH in db.TInvoiceHeader
                  join AA in db.TAccountAssociation on 
                  new { ID = IH.custid.Value } equals new {ID = AA.custid}
                  where aa.username.equals("a")
                  select ID).ToList();

如果 IH.custid 是可空类型,则使用 IH.custid.Value

您现在可以将查询直接绑定到网格视图。

我没有测试过这段代码 - 还有其他几种方法可以实现您的目标。

祝你好运,

帕特里克

【讨论】:

    【解决方案2】:

    这里对 linq 中的子查询有一个很好的答案,这将有所帮助:

    how to do subquery in LINQ

    我从来没有用 subsonic 3 做子查询,但是我建议任何高级 SQl 明智的事情都最好作为视图或存储过程来做,这样你就不会遇到 linq 查询构建器的任何缺失部分在亚音速(上次我检查有一些事情还没有完全做到)

    【讨论】:

    • 我得到了 LINQ,我的问题是在 subsonic3 中使用 ActiveRecord
    【解决方案3】:

    您的问题的答案(但在 C# 中),并使用 In 而不是 join,将是:

    var q = Db.Select.From<TInvoiceHeader>()
        .Where(TInvoiceHeaderTable.custidColumn)
        .In(Db.SelectColumns(TAccountAssociationTable.custidColumn)
                 .From<TAccountAssociation>()
                 .Where(TAccountAssociationTable.usernameColumn)
                 .IsEqualTo("a")
        );
    
    List<TInvoiceHeader> collection = q.ExecuteTypedList<TInvoiceHeader>();
    

    我有一个关于 NotIn 的类似问题:Subsonic 3 ActiveRecord nested select for NotIn bug?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多