Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ-不选择某些字段?_Linq_Linq To Entities - Fatal编程技术网

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表的所有属性。

我使用实体框架映射了一个LINQ查询,如下所示:

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”的子请求时出错而崩溃。我使用了没有大文件的视图,它可以工作!