Линк Новичок. Могу ли я написать этот запрос Linq более кратким? - PullRequest
1 голос
/ 16 июля 2009
 Dim entName = "Some Auto Dealer"
    Dim whereEntity As Expression(Of Func(Of Entity, Boolean)) = Function(en) en.ENTY_Name = entName
    Dim login = Repository(Of Entity).Create().FindSingle(whereEntity)

    Dim whereDealer As Expression(Of Func(Of Dealer, Boolean)) = Function(dlr) dlr.Entity.Equals(login)
    Dim dealer = Repository(Of Dealer).Create().FindSingle(whereDealer)

    Dim whereContract As Expression(Of Func(Of MBI_Contract, Boolean)) = Function(c) c.Dealer.Equals(dealer) AndAlso c.Vehicle.Make.Equals(ford)
    Dim fordContractsFromPSAuto = Repository(Of MBI_Contract).Create().FindAll(whereContract).ToList()

Как я могу написать это лучше? Это работает и довольно быстро, но мне кажется, что это излишне. FindSingle и FindAll принимают Expression(Of Func(Of T, Boolean)) в качестве аргумента для предложения Where. Это моя первая попытка написать лямбда-выражение, поэтому, пожалуйста, прости меня, если оно выглядит плохо.

Примечание Репозиторий является универсальным классом, а Create - это фабричный метод, который возвращает объект DataContext. Это приложение использует LinqToSql.

Спасибо за любой совет. Ура, ~ ck в Сан-Диего

1 Ответ

1 голос
/ 16 июля 2009

Я программист на C #, так что извините, если это предложение действительно не применимо; В C # я бы обычно использовал одну строку, содержащую лямбду и вызов метода; например:

var login = Repository<Entity>.Create().Single(en => en.ENTY_Name == entName);

Я думаю, что вы могли бы сделать что-то подобное в VB, как:

Dim login = Repository(Of Entity).Create().FindSingle( _
    Function(en) en.ENTY_Name = entName)

Это, вероятно, сводится к личным предпочтениям, хотя ...

В качестве альтернативы вы можете переписать все это, используя синтаксис, похожий на запрос; Я использую его не очень часто, поэтому не могу конвертировать ваше очень быстро, но это будет больше похоже на:

Dim contract = From c in Repository(Of MBI_Contract) _
    join d in Repository(Of Dealer) on c.Dealer equals d _
    where d.Entity.ENTY_Name = entName _
    select c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...