- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我可以使用导航属性执行连接,这对我来说更枯燥,因为我没有在任何地方重复连接标准:
(from c in db.Companies
from e in c.Employees
select new { Employee = e, Company = c}).ToList();
因为 ORM 知道 Companies 与 Employees 的关系,所以 c.Employees
导航属性用于推断加入的 FK 标准。
通过导航属性将 multiple from 子句的扩展/lambda 语法直接翻译成什么?
我知道有一个 Join 扩展方法,但需要您明确命名要比较的 FK,而不是通过导航属性暗示该条件。这是行不通的,但希望能表达我的意图:
db.Companies
.Join(c.Employees, /* don't want to explicitly name FKs*/)
.Select(x => new { Employee = x.e, Company = x.c}).ToList();
当然 Join(c.Employees
不起作用,因为在此上下文中没有 c
,但想法是以某种方式使用 Companies.Employees 导航属性来暗示加入标准。
我知道我能做到:
db.Companies.Select(c => new { Employees = c.Employees, Company = c })
但这是一个不同的结果集,因为它为每个公司返回一条记录,然后作为嵌套属性返回员工列表。而不是第一个是连接,因此每个相关组合都有一个记录,结果有一个 Employee
属性而不是 Employees
集合。
我不确定,但猜测 .SelectMany
是直接翻译。您不会获得对父级的 c
引用,因此如果您执行多个操作:
db.Companies.SelectMany(c=>c.Employees).SelectMany(e=>e.VacationDays).Select(v => new { VacationDay = v, Employee = v.Employee, Company = v.Employee.Company })
您必须向后遍历关系才能使连接变平。在 linq 中,它要简单得多,因为您将在选择的上下文中拥有 c
、e
和 v
。我不知道您是否可以在扩展方法中表达相同的内容,以便所有三个别名/引用都被传递下来。也许只是扩展方法语法的结果,但希望有人能提供更好的等价物。
最佳答案
SelectMany
确实是多个 from
子句映射到的内容。
为了将变量保持在投影范围内,每个 SelectMany
需要将序列投影到一个新的匿名对象中,该对象将所有适当的变量保持在范围内:
var query = db.Companies.SelectMany(company => company.Employees,
(company, employee) => new
{
company,
employee
});
要为额外的嵌套导航属性添加额外的投影,只需在随后调用 SelectMany
时重复该模式:
var query = db.Companies.SelectMany(company => company.Employees,
(company, employee) => new
{
company,
employee
}).SelectMany(pair => pair.employee.VacationDays,
(pair, vactionDay) => new
{
pair.company,
pair.employee,
vactionDay,
});
参见 this blog post有关此转换及其扩展方式的更多详细信息和深入描述。
关于c# - 通过导航属性加入的 Lambda 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29421170/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!