首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Subsonic3 ActiveRecord链接查询帮助

Subsonic3 ActiveRecord链接查询帮助
EN

Stack Overflow用户
提问于 2010-06-10 07:47:13
回答 3查看 313关注 0票数 0

我有以下的亚音速实体

代码语言:javascript
复制
TInvoiceHeader
TAccountAssociation

如何在LINQ (亚音速)中实现以下功能

代码语言:javascript
复制
SELECT * from TInvoiceHeader
WHERE custid IN 
  (SELECT custid FROM TAccountAssociation
     WHERE username = 'a')

我需要将结果绑定到GridView。

更新:我试过了

代码语言:javascript
复制
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() 

但是我得到了一个错误"...nested函数窗口不具有与委托相同的签名“

更新:

我真的不明白这个。

代码语言:javascript
复制
why does this work

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


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

但这不是

代码语言:javascript
复制
Dim accounts  = TAccountAssociation.Find(Function(x) x.UserName = "a")

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

更新

我最终使用了流畅的查询

代码语言:javascript
复制
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()

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-10 08:18:04

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

你可以这样做:

代码语言:javascript
复制
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是相同的类型(并且都是可以为空或不可为空的),这就可以工作。如果不是这样,您将需要这样的代码:

代码语言:javascript
复制
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

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

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

祝好运,

帕特里克

票数 1
EN

Stack Overflow用户

发布于 2010-06-10 08:47:48

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

how to do subquery in LINQ

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

票数 0
EN

Stack Overflow用户

发布于 2010-06-11 17:47:48

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

代码语言:javascript
复制
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?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3010767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档