LINQ-不选择某些字段?
我使用实体框架映射了一个LINQ查询,如下所示:LINQ-不选择某些字段?,linq,linq-to-entities,Linq,Linq To Entities,我使用实体框架映射了一个LINQ查询,如下所示: image = this.Context.ImageSet .Where(n => n.ImageId == imageId) .Where(n => n.Albums.IsPublic == true) .Single(); 这将返回单个图像对象并按预期工作 但是,此查询返回数据库中my Image表的所有属性。
image = this.Context.ImageSet
.Where(n => n.ImageId == imageId)
.Where(n => n.Albums.IsPublic == true)
.Single();
这将返回单个图像对象并按预期工作
但是,此查询返回数据库中my Image表的所有属性。
在正常情况下,这很好,但这些图像包含大量二进制数据,需要很长时间才能返回
基本上,在当前状态下,我的linq查询正在执行:
Select ImageId, Name, Data
From Images
...
但我需要一个这样的查询:
Select ImageId, Name
From Images
...
注意,我想加载除数据之外的所有内容。我可以在第二次异步传递时获取此数据,这将创建一个仅设置了这些字段的新映像。当您返回获取所选图像的数据时,我建议继续获取完整的数据集,而不是尝试将其与现有的id/name数据合并。id/name字段相对于数据来说可能很小,代码比尝试合并要简单得多。此外,可能不需要实际构造图像对象,使用匿名类型也可能适合您的目的
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();
或者,您可以在查询表达式中使用select new
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表达式,但我通常会优先使用查询表达式,因为我发现它更可读、更容易理解
谢谢:[如果在DBML设计器中使用Linq 2 SQL],则可以选择延迟加载单个表列。对于较大的二进制字段,将其设置为true。然后,在实际使用之前不会加载该数据 [大家的问题:有人知道实体框架是否支持MSVS2010中延迟加载的varbinary/varchar吗?] 实体框架或linq 2 sql的解决方案2: 创建仅包含主键和varcharmax/varbinarymax的表视图。将其映射到EF 在实体框架设计器中,从表定义中删除varbinarymax/varcharmax属性,使其仅在视图中定义。这将从该表的读/写操作中排除该字段,不过您可以使用记录器验证这一点
通常,您将通过排除数据blob的表访问数据。需要blob时,从视图中加载一行。我不确定您是否能够写入视图,我不确定您将如何写入。您可以写入视图,或者需要编写存储过程,或者可以为一个表生成一个DBML文件。不幸的是,如果使用LINQ to SQL,没有最佳解决方案 您有3种选择: 返回实体,其中包含上下文跟踪和所有字段(在本例中为图像) 选择字段并返回匿名类型 您选择字段并返回一个强类型自定义类,但如果这是您想要的,则会丢失跟踪。 我喜欢LinqtoSQL,但事实就是这样 我为您提供的唯一解决方案是重新构造数据库,将所有大型数据移动到一个单独的表中,并从图像表链接到该表 这样,当返回图像时,您只需在新的DataID字段中返回一个键,然后您就可以在需要时访问更重的数据 干杯至少现在你不能用LINQ做这件事
我知道的最好的方法是为您需要的表创建视图,而不使用大字段,并在该视图中使用LINQ。我曾考虑过您提供的解决方案,但我担心的是,由于正在创建新映像,因此会丢失实体状态。另外,返回类型是Image,所以我认为匿名类型是不可能的。我会做一些测试,我认为这只是LINQtoSQL?太糟糕了。可能是perfectOops是的,这可能只是linq 2 sql。[大家的问题:有人知道实体框架在MSVS 2010中是否支持延迟加载的varbinary/varchar吗?]回答:没有:我认为没有像linq to sql这样的延迟加载选项,这对我来说是最好的解决方案。是的,我认为使用LINQtoSQL,您有时必须更改模式以适应模型。虽然有时我发现实际上它最终会让你的DB设计变得更好….?是的,这是唯一的办法!我尝试使用自定义类选择一些字段,但问题仍然是,带有xmlFile的nvarcharmax字段不在select中,而是在执行处理程序“System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper”的子请求时出错而崩溃。我使用了没有大文件的视图,它可以工作!