Linq新手。我可以更简洁地写这个Linq查询吗?

时间:2009-07-16 16:56:44

标签: linq linq-to-sql generics

 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表达式,所以如果它看起来很糟糕,请原谅我。

注意Repository是一个泛型类,Create是一个返回DataContext对象的工厂方法。此应用程序正在使用LinqToSql。

感谢您的任何建议。 干杯, 〜在圣地亚哥

1 个答案:

答案 0 :(得分: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