簡體   English   中英

Subsonic3 ActiveRecord LINQ查詢幫助

[英]Help with Subsonic3 ActiveRecord LINQ query

我有以下亞音速實體

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

但是我收到一個錯誤“ ...嵌套函數的dow與委托的簽名不同”

更新:

我真的不怕這個...

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

希望有人能給我展示一些更好的東西。

看一下 101個linq示例。 這里有一些很棒的東西。 也請閱讀Scott Gu的博客 -示例與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。

我尚未測試此代碼-還有其他幾種方法可以實現您的目標。

祝好運,

帕特里克

在linq中對子查詢有一個很好的答案,這將有所幫助:

如何在LINQ中執行子查詢

我從來沒有用subsonic 3做子查詢,但是我建議最好使用任何高級SQl明智的方法作為視圖或存儲的proc,這樣您就不會遇到subsonic中linq查詢構建器的任何缺失部分(上次我檢查有幾件事尚未完全完成)

問題的答案(但使用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嵌套選擇NotIn錯誤?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM