2010-06-09 2 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 не имеют ту же сигнатуру, как делегат"

Update:

Я действительно не волнуюсь прибудете это ...

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

Update

Я закончил с использованием текучего 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() 

Надеюсь, кто покажет мне что-то лучше.

+0

Вы используете шаблоны ActiveRecord или Repository для своих объектов? – Rony

+0

Я использую ActiveRecord. –

+0

Я просто не могу понять это ... кто-нибудь? –

ответ

1

Посмотрите на this 101 примеров linq. Здесь есть что-то отличное. Также прочитайте статью Скотта Гу 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 в дозвуковых (последний раз, когда я проверил, РЭБ вещи это не в полной мере сделать еще)

+0

Я как бы получаю LINQ, моя проблема заключается в использовании его в subsonic3 с ActiveRecord –

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?