代码之家  ›  专栏  ›  技术社区  ›  Saif Khan

有关Subsonic3 ActiveRecord Linq查询的帮助

  •  0
  • Saif Khan  · 技术社区  · 14 年前

    我有以下亚音速实体

    TInvoiceHeader
    TAccountAssociation
    

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

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

    我需要将结果绑定到一个网格视图。

    更新:我试过

    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() 
    

    但我得到一个错误“…嵌套函数dows与委托没有相同的签名”

    更新:

    我真的不害怕得到这个…

    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()
    

    更新

    我最终使用了流畅的查询

    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()
    

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

    3 回复  |  直到 14 年前
        1
  •  1
  •   Patrick    14 年前

    看一看 this 101个LINQ示例。这里有一些很棒的东西。 还可以通读顾司各特的 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。

    现在可以将查询直接绑定到GridView。

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

    祝你好运,

    帕特里克

        2
  •  0
  •   Community leo1    7 年前

    Linq中的子查询有一个很好的答案,这将有助于:

    how to do subquery in LINQ

    我从来没有用Subsonic 3做过子查询,但是我建议任何高级的SQL方面的工作最好作为一个视图或存储过程来做,这样您就不会在Subsonic中碰到任何丢失的Linq查询生成器部分(上一次我检查有一些事情它还没有完全做到)。

        3
  •  0
  •   Community leo1    7 年前

    对于您的问题(但在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>();
    

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