帮助Subsonic3 ActiveRecord LINQ查询

时间:2010-06-09 23:47:13

标签: c# vb.net linq subsonic3

我有以下亚音速实体

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

但我得到一个错误“......嵌套函数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()

更新

我最终使用了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()

希望有人会告诉我更好的事情。

3 个答案:

答案 0 :(得分: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

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

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

祝你好运,

帕特里克

答案 1 :(得分:0)

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

how to do subquery in LINQ

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

答案 2 :(得分:0)

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

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?

,我有类似的问题