我有一个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();
答案 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();