2010-01-27 75 views
5

作为一名初级开发人员,您曾经殴打过您的其中一件事是您永远不会在数据集上执行“SELECT *”操作,因为由于多种原因它不可靠。因为移动到Linq(首先Linq到SQL,然后是实体框架),我想知道Linq等价物是否同样被皱起了眉头?Linq no-noes - 抓住所有类似sql的选择?

var MyResult = from t in DataContext.MyEntity 
       where t.Country == 7 
       select t; 

我们是否应该选择到一个匿名类型只有我们想要明确提到的领域,或者是赶上现在所有的选择,因为多余的东西了LinqToSql等人接受周围的数据,他们提供?

问候

+2

那些说你应该*永远不会*,*永远*做$ x的人和那些总是**做$ x的人一样无知。 – 2010-01-27 14:03:33

+0

噢,我完全同意,但它*是*黄金法则之一... – Moo 2010-01-27 14:41:28

回答

5

这不是皱眉,它取决于你的用例。如果你想更新结果并坚持下去,那么你应该选择t,但是如果你不想这样做,只是查询显示目的,你可以通过选择你想要的属性使其更有效:

var MyResult = from t in DataContext.MyEntity 
       where t.Country == 7 
       select new { t.Prop1, t.Prop2 }; 

这是有几个原因。匿名类型的人口稍快,但更重要的是它disables change tracking ...因为你不能坚持匿名类型,所以不需要跟踪对它的更改。

Here's an excellent rundown of the common performance areas like this这很棒,当开始。它还包括我刚刚描述的更改跟踪的更深入的解释。

1

select t在这种情况下S选择从一个已知类型的所有字段。它是强类型的,不太受在SQL中发现的相同错误的影响。

例如,在SQL

INSERT INTO aTable 
SELECT * FROM AnotehrTable 

可能会失败,如果AnotherTable改变,但是Linq中/ .NET这种情况不会出现。

如果您要加入多个表格,那么您无法在Linq中执行select *,您将不得不创建一个匿名类型,其中包含所有类型。

0

我会说你在做什么是相当于SELECT *声明。最好只返回所需的字段,例如

var myResult = from t in DataContext.MyEntity 
       where t.Country == 7 
       select new T 
       { 
        Field1 = t.Field1, 
        Field2 = t.Field2 
       } 
+0

如果您想在MyEntity中使用Everywhere,该怎么办?你会创建一个与MyEntity相同的匿名类型吗? – cjk 2010-01-27 14:01:24

+1

我会认为(没有测试),返回吨OP作为建议,会为你做这个? – James 2010-01-27 14:04:05

0

你应该明确说明你想要选择什么。如果你选择全部,你仍然需要的数据量比你需要的还要多,而且随着新事物的增加,你也会不必要地拖拽这些数据。一般来说,最好的做法是只提取你需要的东西。

0

使用LINQ不会减轻获取额外字段的性能。

但是,它是不可能使用LINQ to SQL生成SELECT * FROM ...。 您的代码将生成一个SELECT语句,该语句显式地命名模型中定义的所有列;它会忽略对数据库的任何更改。

但是,性能仍然是一个问题,所以如果您只使用某些列,则应该使用匿名类型。

0

可能需要按照示例进行操作,特别是如果需要执行的操作是对行的更改。

在SQL select *中与linq不同,因为linq将始终返回相同数量的列(如在dbml中定义的那样)。

1

避免SELECT *的原因是底层数据库可能会更改,因此列顺序可能会更改,这可能会导致数据访问层出现错误。

你不是从你的数据库执行SELECT *,你只是说你想要“t”以及它随之而来的一切。如果那真的是你需要的,那没有什么不妥。