题
我与实体框架映射LINQ查询,看起来是这样的:
image = this.Context.ImageSet
.Where(n => n.ImageId == imageId)
.Where(n => n.Albums.IsPublic == true)
.Single();
此返回单个图像对象和如预期工作。
然而,该查询返回在DB我的图像表的所有属性。 在正常情况下,这将是罚款,但这些图像中含有大量的二进制数据,需要一个很长的时间来恢复。
基本上,在它当前的状态我的LINQ查询正在做:
Select ImageId, Name, Data
From Images
...
但是我需要一个查询,这是否instread:
Select ImageId, Name
From Images
...
请注意,我想加载以外的所有数据。 (I可以得到在第二异步通此数据)
解决方案
不幸的是,如果使用LINQ to SQL,没有最优解。
您有3个选项:
- 您返回实体,与上下文跟踪和所有,在这种情况下的图像,与各领域
- 您选择您的域,并返回一个匿名类型
- 您选择您的域,并返回一个强类型的自定义类,但你失去跟踪,如果那是你想要的东西。 醇>
我爱LINQ到SQL,但那是它的方式。
我的唯一的解决方案为您会从图像表重组你的数据库,所有的大数据移动到一个单独的表,并链接到它。
此方式,当返回图片你只返回新的数据ID字段中的密钥,然后你可以访问较重数据时,如果你需要它。
欢呼声
其他提示
此将创建仅设置这些字段的新图像。当你回去,以便为您选择的影像数据,我建议走在前面,并获得完整的数据集,而不是试图与现有的ID /名称的数据合并。该ID /名称字段是相对于数据大概很小,代码会比试图做合并更简单。此外,它可能没有必要真正构建一个Image对象,使用匿名类型可能会满足你的目的一样好。
image = this.Context.ImageSet
.Where(n => n.ImageId == imageId)
.Where(n => n.Albums.IsPublic == true)
.Select( n => new Image { ImageId = n.ImageId, Name = n.Name }
.Single();
[如果使用LINQ 2 SQL]内DBML设计师,还有使各个表列延迟加载的选项。设置为真为你的大二进制字段。然后,未加载数据,直到它被实际使用。
[问题为大家:有谁知道,如果实体框架的支持延迟加载VARBINARY / VARCHAR在2010年的MSVS? ]
溶液#2(用于实体框架或LINQ 2 SQL):
创建只包含主键和将varchar(最大值)/ VARBINARY(最大)表的视图。映射到这EF
在你的实体框架设计,删除VARBINARY(最大)从表中定义/ VARCHAR(最大值)的财产(留只在视图中定义)。这应该从读/写操作现场排除该表,虽然你可能会验证与记录。
通常你会通过不包括所述数据blob表访问数据。当你需要一滴,你从视图加载一行。我不知道,如果你能写的看法,我不知道你会怎么做写入。您可以写信给视图,或者您可能需要编写一个存储过程,也可以出局了一个表中的DBML文件。
您不能做到这一点的 LINQ 至少现在...
我所知道的最好的办法是为表创建View
你需要没有大的领域,使用 LINQ 与View
。
另外,您可以在查询表达式中使用选择新...
var image =
(
from i in db.ImageSet
where i.ImageId == imageId && i.Albums.IsPublic
select new
{
ImageId = i.ImageId,
Name = i.Name
}
).Single()
在LINQ查询表达式实际上得到转换为在编译时Lambda表达式,但我prefair使用查询表达式通常,因为我发现它更易于阅读和理解。
感谢的:)强>