2010-06-09 71 views
0

我有以下的亚音速实体帮助Subsonic3 ActiveRecord的LINQ查询

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不具有相同签名的委托”

更新:

我真的不吓坏GET这...

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

希望有人会告诉我更好的东西。

+0

您是否在为实体使用ActiveRecord或Repository模式? – Rony 2010-06-10 00:20:30

+0

我正在使用ActiveRecord。 – 2010-06-10 00:23:47

+0

我只是无法弄清楚.... ....任何人? – 2010-06-10 01:17:17

回答

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.Value将被使用,如果IH.custid是可空类型

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

我还没有测试过这个代码 - 还有其他几种方法来实现你的目标。

祝你好运,

帕特里克

0

有一个很好的答案,子查询在LINQ这里,这将有助于:

how to do subquery in LINQ

我从来没有做但是亚音速3子查询我建议任何先进的SQl明智更好地做为一个视图或存储过程,以便您不会碰到亚音速linq查询生成器的任何缺失的部分(上次我检查有af它没有EW事情完全做还)

+0

我有种得到LINQ,我的问题是使用它在subsonic3与ActiveRecord – 2010-06-10 00:54:39

0

的回答你的问题(但在C#),并使用,而不是加入,将是:

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

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