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
C# Linq到SQL包含扩展方法不起作用_C#_Linq_Linq To Sql - Fatal编程技术网

C# Linq到SQL包含扩展方法不起作用

C# Linq到SQL包含扩展方法不起作用,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我尝试了来自的Include扩展方法,但它并没有真正起作用 所以我在Linq to SQL中有一个查询: var items = dataContext.Items() .Where(x => x.Id < 100) .ToList(); 现在,如果我不使用数据加载选项,而是将查询重写为: var items = dataContext.Items() .Where(x =>

我尝试了来自的
Include
扩展方法,但它并没有真正起作用

所以我在Linq to SQL中有一个查询:

 var items = dataContext.Items()
            .Where(x => x.Id < 100)             
            .ToList();
现在,如果我不使用数据加载选项,而是将查询重写为:

 var items = dataContext.Items()
            .Where(x => x.Id < 100)
            .Select(x=>new Tuple<Item, EntitySet<ItemImage>>(x, x.ItemImages))
            .AsEnumerable()
            .Select(x=>x.Item1)
            .ToList();
var items=dataContext.items()
.其中(x=>x.Id<100)
.Select(x=>newtuple(x,x.ItemImages))
.可计算的()
.选择(x=>x.Item1)
.ToList();
生成的SQL语句相同:

SELECT [t0].[Id], [t0].[Number], [t0].[Title], [t1].[Id] AS [Id2], [t1].[ItemId], [t1].[Url], (
SELECT COUNT(*)
FROM [dbo].[ItemImage] AS [t2]
WHERE [t2].[ItemId] = [t0].[Id]
) AS [value]
FROM [dbo].[Item] AS [t0]
LEFT OUTER JOIN [dbo].[ItemImage] AS [t1] ON [t1].[ItemId] = [t0].[Id]
WHERE [t0].[Id] < @p0
ORDER BY [t0].[Id], [t1].[Id]
选择[t0].[Id]、[t0].[Number]、[t0].[Title]、[t1].[Id]作为[Id2]、[t1].[ItemId]、[t1].[Url](
选择计数(*)
从[dbo].[ItemImage]到[t2]
其中[t2].[ItemId]=[t0].[Id]
)作为[价值]
从[dbo].[Item]到[t0]
[t1].[ItemId]=[t0].[Id]上的左外联接[dbo].[ItemImage]为[t1]
其中[t0].[Id]<@p0
[t0].[Id],[t1].[Id]下的订单
但是,如果我正在访问
项[0].ItemImages
属性,它确实会请求SQL Server检索项图像,因此它似乎拥有避免额外查询所需的所有数据,但具体化出错,它仍然会执行额外查询,尽管它可以避免这些查询

我能修一下吗


更新:我对使用LoadWith选项的性能非常怀疑,并认为在代码中执行两个查询(一个用于项目,另一个用于图像)和映射会比Linq2Sql生成的单个SQL查询更快,但至少对于我的数据量,单个查询的工作速度更快,因此,看到一个解决方案将是非常有趣的。

我的博客上的include方法仅在一对一关系中演示和测试

通过将引用的查询投影到一个查询,它填充LINQ到SQL标识缓存。以后导航任何导航属性时,它将首先命中该缓存

不幸的是,LINQtoSQL不够先进,无法以这种方式缓存到许多关联

您可以选择使用LoadWith,也可以编写一个查询,该查询可以按以下方式进行项目和分组:

var items = dataContext.ItemImages()
        .Where(x => x.Item.Id < 100)
        .Select(x => new Tuple<ItemImage, Item>(x, x.Item))
        .AsEnumerable()
        .Select(x = > x.Item1)
        .GroupBy(x => x.Item);
var items=dataContext.itemmages()
.其中(x=>x.Item.Id<100)
.Select(x=>newtuple(x,x.Item))
.可计算的()
.选择(x=>x.Item1)
.GroupBy(x=>x.Item);

此查询的警告是,您不会看到任何没有ItemImages的项。

为什么使用
Tuple
而不是匿名类型?在这个具体示例中,没有明显的理由使用Tuple,但要使用通用扩展方法,Tuple非常方便,如果你看我在开始时提到的博客文章,你会看到扩展方法的样子。顺便说一句,匿名类型的行为是一样的。
var items = dataContext.ItemImages()
        .Where(x => x.Item.Id < 100)
        .Select(x => new Tuple<ItemImage, Item>(x, x.Item))
        .AsEnumerable()
        .Select(x = > x.Item1)
        .GroupBy(x => x.Item);