首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq no-noes - catch all sql-like select?

Linq no-noes - catch all sql-like select?
EN

Stack Overflow用户
提问于 2010-01-27 21:56:47
回答 7查看 437关注 0票数 5

作为初级开发人员,你被灌输的一件事是,你永远不会对数据集执行"SELECT *“操作,因为由于几个原因,它是不可靠的。

自从转到Linq (首先是Linq to SQL,然后是Entity Framework),我想知道Linq的等价物是否同样不受欢迎?

例如

代码语言:javascript
复制
var MyResult = from t in DataContext.MyEntity
               where t.Country == 7
               select t;

我们应该选择一个匿名类型,只包含我们想要显式提到的字段,还是LinqToSql等人现在可以接受catch all select,因为他们提供的数据周围有额外的东西?

问候

Moo

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-01-27 22:00:36

它不是不受欢迎的,它是由你的用例决定的。如果你想更新结果并持久化它,那么你应该选择t,但是如果你不想这样做,只是为了显示而查询,你可以通过选择你想要的属性来提高效率:

代码语言:javascript
复制
var MyResult = from t in DataContext.MyEntity
               where t.Country == 7
               select new { t.Prop1, t.Prop2 };

这有几个原因。匿名类型的填充稍微快一点,但更重要的是,它disables change tracking...because你不能持久化匿名类型,也不需要跟踪对它的更改。

这在刚开始的时候很棒。它还包括对我刚才描述的更改跟踪的更深入的解释。

票数 5
EN

Stack Overflow用户

发布于 2010-01-27 22:00:26

select t在本例中是从已知类型中选择所有字段。它是强类型的,并且较少受到SQL中相同错误的影响。

例如在SQL中

代码语言:javascript
复制
INSERT INTO aTable
SELECT * FROM AnotehrTable

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

如果要连接多个表,则不能在Linq中执行select *,必须使用其中包含的所有类型创建匿名类型。

票数 1
EN

Stack Overflow用户

发布于 2010-01-27 22:01:34

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

你没有从你的数据库中执行SELECT *,你只是说你想要"t“以及与之相关的所有东西。如果这真的是你需要的,那也没什么错。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2147354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档