gpt4 book ai didi

c# - 使用 Include() 和条件过滤器连接两个表

转载 作者:行者123 更新时间:2023-11-30 18:11:37 25 4
gpt4 key购买 nike

我有现有代码要更新。我想加入另一个名为 Table3 的表。由于查询对 Table2 有一个 include,我想添加另一个带有条件过滤器的 .Include 并避免左连接。

当我将 .include 添加到 .where 时,我无法访问 t3Id。 Intellisense 仅显示表 Table3 而不是 Id 字段。

我错过了语法吗?谢谢。

Table1 有一个名为 t1Id 的键。

 var query = (from e in ctx.Table1
.Include(r => r.Table2.Select(p => p.name))
.Include(rj => rj.Table3).Where(s => s.t1Id == t3Id)
select e).ToList();

Table1 将具有以下内容:

Id  name  
1 Joe
2 Mary
3 Harry

Table3 将具有以下内容:

t1Id   title
3 staff
3 fulltime

预期结果:

1  Joe
2 Mary
3 Harry [{2, staff}, {3, fulltime}]

由于 Harry 在映射表中有一条记录,他将有一个包含 Table3 行的数组。

最佳答案

最好尽可能使用Select 而不是IncludeSelect 将允许您仅查询您真正计划使用的属性,从而使选定数据从数据库管理系统传输到您的进程的速度更快。

例如,如果您查询“Schools with their Students”,Student 将有一个外键,其值等于 School 的主键。因此,如果您有 School 10,现在所有 5000 名学生都将拥有一个值为 10 的 SchoolId。将同一个值 10 发送超过 5000 次有点浪费。

When querying data, always use Select. Only use Include if you plan to update the fetched data.

您的查询(在方法语法中):

var result = dbContext.Table1
.Where(table1Element => ...) // only if you don't want all elements of Table1
.Select(table1Element => new
{
// only select the table1 elements that you plan to use:
Id = table1Element.Id,
Name = table1Element.Name,

// Select the items that you want from Table 2:
Table2Items = table1Element.Table2
.Where(table2Element => ...) // only if you don't want all table2 elements
.Select(table2Element => new
{
// Select only the properties of table2 you plan to use:
Id = table2Element.Id,
Name = table2Element.Name,
...

// the following not needed, you already know the value:
// Table1Id = table2Element.table1Id, // foreign key
})
.ToList(),

// Table3: your new code:
Table3Items = table1Element.Table3
.Select(table3Element => new
{
// again: only the properties you plan to use
Id = table3Element.Id,
...

// the following not needed, you already know the value:
// Table1Id = table3Element.table1Id, // foreign key
})
.ToList(),
});

您看到读者更容易看出他获得了哪些属性吗?如果其中一个表被展开,那么新属性就不会在此查询中获取,毕竟:用户显然不需要新属性。它们也没有在此功能的规范中描述。

注意:因为我使用了 new,所以我的类型是匿名类型。您只能在您的函数中使用它们。如果需要返回获取的数据,将数据放在一个已知的类中:

.Select(table1Element => new Table1Class()
{
Id = table1Element.Id,
Name = table1Element.Name,
...
});

再一次:考虑不要填写外键,因为您可能不会使用它们

关于c# - 使用 Include() 和条件过滤器连接两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57397912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com