2009-05-08 4 views
1

У меня есть таблица, и мне нужно выбрать запись на основе Id. Я хочу только вернуть запись с Max (Date) в поле даты. Как мне это сделать?Linq To Sql vb.net help

В SQL Server я использую этот

SELECT * FROM dch 
WHERE EffectiveDate = (SELECT MAX(EffectiveDate) FROM dch 
WHERE ID = 99) AND ID = 99 

Как я могу сделать это в Linq. К сожалению, это приложение закодировано в VB.NET, поскольку мы унаследовали его именно так.

Я пытался эти

Dim qry = (From dch In db.dch _ 
        Where dch.Dealer.Equals(Dealer) _ 
        Select dch.EffectiveDate).Max() 

или

Dim qry = (From dch In db.dch _ 
        Where dch.Dealer.Equals(Dealer) _ 
        Select).Max(dch.EffectiveDate) 

И очевидно, что они не работают. Я даже близко? Любые идеи были бы хорошы.

Спасибо заранее.

ответ

2

Прошу прощения за любые ошибки в синтаксисе VB, я (в основном) программист на C#.

Dim item = db.dch.Where(Func(d) d.ID == 99) _ 
       .OrderByDescending(Func(d) d.EffectiveDate)_ 
       .Take(1) 

Это будет на самом деле реализован как

select top 1 <...columns...> 
from dch 
where ID == 99 
order by EffectiveDate desc 

который я думаю, что эквивалентно вашему запросу.

+0

Это похоже на способ сделать это со мной. Хотя он «выглядит» неэффективным, помните, что запрос не выполняется до тех пор, пока вы на самом деле не попытаетесь выполнить итерацию результатов, и к этому времени он будет оптимизирован. –

+0

милый !!! Работает идеально для моих нужд. Я ценю подсказку !! ~ ck – 2009-05-14 21:59:08

0

Я не специально отвечаю на ваш вопрос. Это более один из тех, кто обучает человека сценарию типа рыбы ... но, изучая Linq, закладок этого сайта и часто посещайте его. 101 Linq VB Samples

Your specific answer is here under Max about halfway down.

Этот сайт будет решить 80% новых вопросов LINQ, идущих вперед.

Для справки, по вашему описанию, я думаю, что это то, что вы хотите.

dim results = (from d in db.dch where d.ID == 99 select d.EffectiveDate).Max()

Конечно, это будет возвращать только самую высокую эффективную дату.

0

В вашем втором запросе, вы должны передать лямбда-выражение в качестве аргумента метода расширения Max:

Dim qry = (From dch In db.dch _ 
      Where dch.Dealer.Equals(Dealer) _ 
     ).Max(Function (item) item.EffectiveDate) 

Edit: Принимая второй взгляд на ваш вопрос, я понимаю, что я на самом деле не ответ это, потому что вам нужно будет сделать второй запрос, чтобы получить фактические результаты. Кроме того, первый запрошенный вами запрос должен делать то же самое, что и мой запрос (который получает максимальное значение EffectiveDate).