除非明确请求,否则实体框架会避免检索列

时间:2011-03-31 04:28:47

标签: linq entity-framework-4

我有一个SQL表存储一个人记录,其中一列是图像。我在ASP.Net MVC应用程序中使用该表,我只想检索我的HTML图像源属性使用的控制器操作中的图像列。

如何防止我的LINQ查询检索存储图像的列,而不必求助于显式请求每个所需的列,但仍然可以使用显式请求检索它?

这是LINQ表达式我不想返回图像列(有大约十几个包含所以明确指定每个属性不是一个选项):

Person person = (from per in entities.People.Include(...).Include(..) 
                 where per.ID == id 
                 select per).FirstOrDefault();

我用来获取图像的LINQ表达式是:

byte[] picture = (from per in entities.People 
                  where Per.ID == id 
                  select per.Picture).FirstOrDefault();

4 个答案:

答案 0 :(得分:3)

您必须使用table splitting。表拆分的关键是您不要触摸数据库,而是将多个实体映射到单个表。

您的Person实体将不再包含Image,而是包含PersonImage实体的导航属性。新实体仅包含Id(与相关人员=>一对一关系相同)和Image。只有在需要时才能加载导航属性。除非使用投影或query view(您可能不想使用),否则无法避免加载标量属性。

答案 1 :(得分:1)

考虑到当你有一个很大但很少使用它的部分时有很多理由拆分表,为什么要在代码端解决这个问题呢?您最好的选择可能是在与第一个链接的单独表格中关闭图像。你的SQL服务器会更快乐,你的代码也会更干净。

答案 2 :(得分:1)

根据您使用EF4(数据库优先?模型优先?)的方式,您可以创建一个不包含图像的视图(和另一个实体)。或者,您可以在模型端使用定义查询:http://blogs.msdn.com/b/davidebb/archive/2010/10/01/the-easy-way-to-create-an-entity-framework-defining-query.aspx

答案 3 :(得分:0)

var smallPerson = from per in entities.People.Include(...).Include(..) 
                  where per.ID == id 
                  select new Person() {
                    .Name = per.Name,
                    .Surname = per.Surname
                  }).FirstOrDefault();

或者,只需使用此类似方法返回匿名类型。该对象将是只读的。

var smallPerson = from per in entities.People.Include(...).Include(..) 
                  where per.ID == id 
                  select new {
                    .Name = per.Name,
                    .Surname = per.Surname
                  }).FirstOrDefault();