帮助需要LINQ语法

时间:2011-03-10 19:30:12

标签: c# .net linq

有人可以帮助更改为以下从产品表中选择唯一的模型

 var query = from Product in ObjectContext.Products.Where(p => p.BrandId == BrandId & p.ProdDelOn == null)
             orderby Product.Model
             select Product;

3 个答案:

答案 0 :(得分:5)

我猜你还想根据现有的Where()子句进行过滤。我认为这应该为你处理(并将包括订购):

var query = ObjectContext.Products
    .Where(p => p.BrandId == BrandId && p.ProdDelOn == null)
    .Select(p => p.Model)
    .Distinct()
    .OrderBy(m => m);

但是,根据您阅读帖子的方式...也可以在您尝试从结果中获取单个唯一模型时使用(这是一个不同的查询):

var model = ObjectContext.Products
    .Where(p => p.BrandId == BrandId && p.ProdDelOn == null)
    .Select(p => p.Model)
    .First();

答案 1 :(得分:0)

&更改为&&并添加以下行: query = query.Distinct();

答案 2 :(得分:-1)

恐怕我无法回答这个问题 - 但我想对此发表评论。

恕我直言,这是过去几年.NET Framework发展方向出现问题的一个很好的例子。我不能忍受LINQ,也不会对扩展方法,匿名方法,lambda表达式等感到太热情。

原因如下:我还没有看到这样的情况,其中任何一件事实际上都有助于解决现实世界的编程问题。 LINQ无法替代SQL,所以你(或者至少是项目)仍然需要掌握它。编写LINQ语句并不比编写SQL简单,但它确实添加了运行时处理来构建表达式树并将其“编译”为SQL语句。现在,如果使用LINQ比使用SQL更容易解决复杂问题,或者如果它意味着您不需要也知道SQL,并且如果您可以信任LINQ将产生足够好的SQL all 时间,它可能仍然值得使用。但是没有满足这些先决条件,所以我不知道应该有什么好处。

当然,在老式的SQL中,语句将是

SELECT DISTINCT [Model] 
FROM [Product]
WHERE [BrandID] = @brandID AND [ProdDelOn] IS NULL
ORDER BY [Model]

在许多情况下,可以使用dev工具轻松生成语句,并使用存储过程进行封装。这会表现得更好,但我会批准,对于很多事情,LINQ和更简单的存储过程之间的性能差异将是完全无关紧要的。 (另一方面,性能问题确实存在潜入的趋势,因为我们经常使用完全不切实际的数据量以及与在实际生产系统中托管我们的软件的人几乎没有共同点的环境。)但是优点是只是没有使用LINQ是巨大的:

1)所需技能较少(因为你必须使用SQL)  2)所有数据访问都可以以一种方式执行(因为你还需要SQL)  3)一些控制如何获取数据而不仅仅是什么  4)被正当地指责编写英国媒体报道软件的机会较少(更有效率)

对于自C#2.0以来引入的许多新语言功能,可以说类似的事情,尽管我很欣赏并使用它们中的一些。类型推理的“var”关键字非常适合初始化本地化 - 在同一行上两次获取相同的类型信息并不多见。但是,如果你有一个问题要解决,我们不要假装这有点帮助。对于匿名类型也是如此 - 嵌套的私有类型提供相同的目的,几乎没有更多的代码,并且我发现没有用于此功能,因为它是新的和有光泽的尝试。扩展方法实际上只是简单的旧实用程序方法,我还没有听到任何关于为什么应该使用SAME语法的实例方法和在另一个类上调用的静态方法的任何好的解释!这实际上意味着方法添加到类中并且不获取构建警告或错误可能会破坏应用程序。 (如果你怀疑:如果你有一个扩展方法Bar()用于你的Foo类型,Foo.Bar()调用一个完全不同的实现,它可能会或可能不会像你的扩展方法Bar()做的那样做引入一个具有相同签名的实例方法。它将在运行时构建并崩溃。)

很抱歉这样咆哮,也许有更好的地方发布这个比回答问题。但我真的认为任何一个从LINQ开始的人都在浪费时间 - 除非它正准备进行MS认证考试,AFAIU也有点远离现实。