C# 有关Subsonic3 ActiveRecord LINQ查询的帮助

C# 有关Subsonic3 ActiveRecord LINQ查询的帮助,c#,vb.net,linq,subsonic3,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)

我有以下亚音速实体

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() 
但是我得到一个错误…嵌套函数没有与委托相同的签名

更新:

我真的不明白

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查询

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到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();
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();
只要ID.custid和aa.custid是同一类型,并且都是可为null或不可为null的,这将起作用。如果不是这样,您将需要以下内容:

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

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

祝你好运


Patrick

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


我从来没有用亚音速3做过子查询,但是我建议高级SQl最好是作为视图或存储过程来做,这样你就不会在亚音速中遇到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,我也有一个类似的问题:

您是否为您的实体使用ActiveRecord或存储库模式?我使用的是ActiveRecord。我就是不明白这一点……有人吗?我发现运行subsonics TT文件非常简单,对于任何类型的表联接,最好创建视图,它将特定于数据库的代码保存在数据库中,然后您可以像从表中选择一样从视图中进行简单选择,KISI有点获得LINQ,我的问题是在亚音速3中使用它与ActiveRecord