2009-07-16 116 views
1
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子句的arg。這是我第一次寫Lambda表達式,所以如果看起來不好,請原諒我。Linq新手。我可以寫這個Linq查詢更簡潔嗎?

注意Repository是一個通用類,Create是一個返回DataContext對象的工廠方法。此應用程序正在使用LinqToSql。

感謝您的任何建議。 乾杯, 〜ck聖地亞哥

+0

我不熟悉Expression或OF Func等,你可能會考慮使用C# ,也許它的lambda表示法更簡單。 – 2009-07-16 17:05:17

+0

是的,我同意100%c#,c => c.Something = someValue非常容易使用,但是這個特定的項目是用VB.NET編寫的,將它轉換爲C#是從項目經理的恐龍中被擊落的。 – Hcabnettek 2009-07-16 17:20:15

回答

1

我是C#程序員,所以我很抱歉,如果這個建議並不真正適用;在C#中,我通常會使用一行包含lambda和方法調用的行;例如:

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