【问题标题】:Linq Newbie. Can I write this Linq query more concise?林克新手。我可以更简洁地编写这个 Linq 查询吗?
【发布时间】:2009-07-16 16:56:43
【问题描述】:
 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。

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

【问题讨论】:

  • 我不熟悉Expression,或者OF Func等,你可以考虑使用C#,也许它的lambdas表示法更简单。
  • 是的,我 100% 同意 c#,c=>c.Something = someValue 非常易于使用,但是这个特殊的项目是用 VB.NET 编写的,并将其转换为 C# 是从项目经理的恐龙。

标签: linq linq-to-sql generics


【解决方案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

【讨论】:

  • 酷。谢谢你的建议。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
相关资源
最近更新 更多