作为初级开发人员,你被灌输的一件事是,你永远不会对数据集执行"SELECT *“操作,因为由于几个原因,它是不可靠的。
自从转到Linq (首先是Linq to SQL,然后是Entity Framework),我想知道Linq的等价物是否同样不受欢迎?
例如
var MyResult = from t in DataContext.MyEntity
where t.Country == 7
select t;我们应该选择一个匿名类型,只包含我们想要显式提到的字段,还是LinqToSql等人现在可以接受catch all select,因为他们提供的数据周围有额外的东西?
问候
Moo
发布于 2010-01-27 22:00:36
它不是不受欢迎的,它是由你的用例决定的。如果你想更新结果并持久化它,那么你应该选择t,但是如果你不想这样做,只是为了显示而查询,你可以通过选择你想要的属性来提高效率:
var MyResult = from t in DataContext.MyEntity
where t.Country == 7
select new { t.Prop1, t.Prop2 };这有几个原因。匿名类型的填充稍微快一点,但更重要的是,它disables change tracking...because你不能持久化匿名类型,也不需要跟踪对它的更改。
这在刚开始的时候很棒。它还包括对我刚才描述的更改跟踪的更深入的解释。
发布于 2010-01-27 22:00:26
select t在本例中是从已知类型中选择所有字段。它是强类型的,并且较少受到SQL中相同错误的影响。
例如在SQL中
INSERT INTO aTable
SELECT * FROM AnotehrTable如果AnotherTable改变了,可能会失败,但是在Linq / .Net中不会出现这种情况。
如果要连接多个表,则不能在Linq中执行select *,必须使用其中包含的所有类型创建匿名类型。
发布于 2010-01-27 22:01:34
避免SELECT *的原因是底层数据库可能会更改,因此列顺序可能会更改,这可能会在数据访问层中导致错误。
你没有从你的数据库中执行SELECT *,你只是说你想要"t“以及与之相关的所有东西。如果这真的是你需要的,那也没什么错。
https://stackoverflow.com/questions/2147354
复制相似问题