我与实体框架映射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个选项:

  1. 您返回实体,与上下文跟踪和所有,在这种情况下的图像,与各领域
  2. 您选择您的域,并返回一个匿名类型
  3. 您选择您的域,并返回一个强类型的自定义类,但你失去跟踪,如果那是你想要的东西。
  4. 我爱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使用查询表达式通常,因为我发现它更易于阅读和理解。

感谢的:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top