Linq 什么是“林克”;加入;铁锈的当量?
我正在尝试对rust中的两个向量执行内部联接,但不确定如何实现这一点。Linq 什么是“林克”;加入;铁锈的当量?,linq,rust,traits,rust-cargo,rust-diesel,Linq,Rust,Traits,Rust Cargo,Rust Diesel,我正在尝试对rust中的两个向量执行内部联接,但不确定如何实现这一点。 简言之,我正在寻找具有部门名称的员工。 如果有人熟悉这里的C#LINQ,那么我正试图在rust中实现以下目标。 考虑型号rs中规定的相同型号 from e in employees join d in department on e.dept_id equals d.dept_id select new { DeptName= d.dept_name, Name = e.name }; 这是我的rust语
简言之,我正在寻找具有部门名称的员工。
如果有人熟悉这里的C#LINQ,那么我正试图在rust中实现以下目标。
考虑型号rs中规定的相同型号
from e in employees
join d in department
on e.dept_id equals d.dept_id
select new
{
DeptName= d.dept_name,
Name = e.name
};
这是我的rust语言代码:
型号.rs
use bigdecimal::BigDecimal;
use chrono::{NaiveDateTime, Utc};
pub struct Department {
pub dept_id: i32,
pub dept_name: Option<String>,
pub created_on: Option<NaiveDateTime>,
pub created_by: Option<String>,
pub modified_on: Option<NaiveDateTime>,
pub modified_by: Option<String>,
pub is_active: Option<bool>,
}
impl Department {
pub fn get_departments() -> Vec<Department> {
vec![
Department {
dept_id: 101,
dept_name: Option::from("Software".to_string()),
created_on: Option::from(Utc::now().naive_utc()),
created_by: Option::from("Jadon".to_string()),
modified_on: None,
modified_by: None,
is_active: Option::from(true),
},
Department {
dept_id: 102,
dept_name: Option::from("Hr".to_string()),
created_on: Option::from(Utc::now().naive_utc()),
created_by: Option::from("Jadon".to_string()),
modified_on: None,
modified_by: None,
is_active: Option::from(true),
},
Department {
dept_id: 103,
dept_name: Option::from("Hr".to_string()),
created_on: Option::from(Utc::now().naive_utc()),
created_by: Option::from("Jadon".to_string()),
modified_on: None,
modified_by: None,
is_active: Option::from(true),
},
]
}
}
pub struct Employee {
pub employee_id: i32,
pub name: Option<String>,
pub age: Option<i32>,
pub address: Option<String>,
pub email: Option<String>,
pub dept_id: i32,
pub salary: Option<BigDecimal>,
pub created_on: Option<NaiveDateTime>,
pub created_by: Option<String>,
pub modified_on: Option<NaiveDateTime>,
pub modified_by: Option<String>,
pub is_active: Option<bool>,
}
impl Employee {
pub fn get_employees() -> Vec<Employee> {
vec![
Employee {
employee_id: 1001,
name: Option::from("Marten Babel".to_string()),
age: Option::from(25),
address: Option::from("Netherland".to_string()),
email: Option::from("somemail@gmail.com".to_string()),
dept_id: 101,
salary: Option::from(BigDecimal::from(50000.00)),
created_on: Option::from(Utc::now().naive_utc()),
created_by: Option::from("Tom".to_string()),
modified_on: None,
modified_by: None,
is_active: Option::from(true),
},
Employee {
employee_id: 1002,
name: Option::from("Jack Sancho".to_string()),
age: Option::from(22),
address: Option::from("England".to_string()),
email: Option::from("jacksemail@gmail.com".to_string()),
dept_id: 102,
salary: Option::from(BigDecimal::from(80000.00)),
created_on: Option::from(Utc::now().naive_utc()),
created_by: Option::from("Tom".to_string()),
modified_on: None,
modified_by: None,
is_active: Option::from(true),
},
Employee {
employee_id: 1003,
name: Option::from("Phil Foden".to_string()),
age: Option::from(29),
address: Option::from("England".to_string()),
email: Option::from("philsemail@gmail.com".to_string()),
dept_id: 101,
salary: Option::from(BigDecimal::from(80000.00)),
created_on: Option::from(Utc::now().naive_utc()),
created_by: Option::from("Tom".to_string()),
modified_on: None,
modified_by: None,
is_active: Option::from(true),
},
]
}
}
fn main() {
let department: Vec<Department> = Department::get_departments();
for dept in department {
println!(
"Dept Id: {} and Dept Name: {}",
dept.dept_id,
dept.dept_name.unwrap_or_default()
);
}
let employee: Vec<Employee> = Employee::get_employees();
for emp in employee {
println!(
"Name is: {} and age is : {}",
emp.name.unwrap_or_default(),
emp.age.unwrap_or_default()
)
}
}
使用bigdecimal::bigdecimal;
使用chrono::{NaiveDateTime,Utc};
酒吧结构部{
酒吧部门id:i32,
酒吧部门名称:选项,
已在上创建发布:选项,
发布创建人:Option,
pub-modified_-on:选项,
发布修改人:选项,
发布处于活动状态:选项,
}
执行部{
pub fn get_departments()->Vec{
维克[
系{
部门代码:101,
部门名称:选项::从(“软件”。到字符串()),
创建时间:Option::from(Utc::now().naive_Utc()),
创建人:Option::from(“Jadon.to_string()),
修改内容:无,
修改人:无,
_是否处于活动状态:选项::from(true),
},
系{
部门代码:102,
部门名称:选项::from(“Hr”。to_string()),
创建时间:Option::from(Utc::now().naive_Utc()),
创建人:Option::from(“Jadon.to_string()),
修改内容:无,
修改人:无,
_是否处于活动状态:选项::from(true),
},
系{
部门代码:103,
部门名称:选项::from(“Hr”。to_string()),
创建时间:Option::from(Utc::now().naive_Utc()),
创建人:Option::from(“Jadon.to_string()),
修改内容:无,
修改人:无,
_是否处于活动状态:选项::from(true),
},
]
}
}
发布结构雇员{
酒吧员工id:i32,
酒吧名称:Option,
酒吧时代:选择,
发布地址:选项,
发布电子邮件:选项,
酒吧部门id:i32,
酒吧薪水:选择权,
已在上创建发布:选项,
发布创建人:Option,
pub-modified_-on:选项,
发布修改人:选项,
发布处于活动状态:选项,
}
impl员工{
pub fn get_employees()->Vec{
维克[
雇员{
员工id:1001,
名称:选项::from(“Marten Babel”.to_string()),
年龄:选项::从(25岁),
地址:选项::from(“荷兰”。to_string()),
电子邮件:选项::发件人(“somemail@gmail.com“.to_string()),
部门代码:101,
工资:选项::from(BigDecimal::from(50000.00)),
创建时间:Option::from(Utc::now().naive_Utc()),
创建人:Option::from(“Tom.to_string()),
修改内容:无,
修改人:无,
_是否处于活动状态:选项::from(true),
},
雇员{
员工id:1002,
名称:选项::from(“Jack Sancho”.to_string()),
年龄:选项::from(22),
地址:选项::from(“England”.to_string()),
电子邮件:选项::发件人(“jacksemail@gmail.com“.to_string()),
部门代码:102,
工资:选项::from(BigDecimal::from(80000.00)),
创建时间:Option::from(Utc::now().naive_Utc()),
创建人:Option::from(“Tom.to_string()),
修改内容:无,
修改人:无,
_是否处于活动状态:选项::from(true),
},
雇员{
员工id:1003,
名称:选项::from(“Phil Foden”.to_string()),
年龄:选项::from(29),
地址:选项::from(“England”.to_string()),
电子邮件:选项::发件人(“philsemail@gmail.com“.to_string()),
部门代码:101,
工资:选项::from(BigDecimal::from(80000.00)),
创建时间:Option::from(Utc::now().naive_Utc()),
创建人:Option::from(“Tom.to_string()),
修改内容:无,
修改人:无,
_是否处于活动状态:选项::from(true),
},
]
}
}
main.rs
use bigdecimal::BigDecimal;
use chrono::{NaiveDateTime, Utc};
pub struct Department {
pub dept_id: i32,
pub dept_name: Option<String>,
pub created_on: Option<NaiveDateTime>,
pub created_by: Option<String>,
pub modified_on: Option<NaiveDateTime>,
pub modified_by: Option<String>,
pub is_active: Option<bool>,
}
impl Department {
pub fn get_departments() -> Vec<Department> {
vec![
Department {
dept_id: 101,
dept_name: Option::from("Software".to_string()),
created_on: Option::from(Utc::now().naive_utc()),
created_by: Option::from("Jadon".to_string()),
modified_on: None,
modified_by: None,
is_active: Option::from(true),
},
Department {
dept_id: 102,
dept_name: Option::from("Hr".to_string()),
created_on: Option::from(Utc::now().naive_utc()),
created_by: Option::from("Jadon".to_string()),
modified_on: None,
modified_by: None,
is_active: Option::from(true),
},
Department {
dept_id: 103,
dept_name: Option::from("Hr".to_string()),
created_on: Option::from(Utc::now().naive_utc()),
created_by: Option::from("Jadon".to_string()),
modified_on: None,
modified_by: None,
is_active: Option::from(true),
},
]
}
}
pub struct Employee {
pub employee_id: i32,
pub name: Option<String>,
pub age: Option<i32>,
pub address: Option<String>,
pub email: Option<String>,
pub dept_id: i32,
pub salary: Option<BigDecimal>,
pub created_on: Option<NaiveDateTime>,
pub created_by: Option<String>,
pub modified_on: Option<NaiveDateTime>,
pub modified_by: Option<String>,
pub is_active: Option<bool>,
}
impl Employee {
pub fn get_employees() -> Vec<Employee> {
vec![
Employee {
employee_id: 1001,
name: Option::from("Marten Babel".to_string()),
age: Option::from(25),
address: Option::from("Netherland".to_string()),
email: Option::from("somemail@gmail.com".to_string()),
dept_id: 101,
salary: Option::from(BigDecimal::from(50000.00)),
created_on: Option::from(Utc::now().naive_utc()),
created_by: Option::from("Tom".to_string()),
modified_on: None,
modified_by: None,
is_active: Option::from(true),
},
Employee {
employee_id: 1002,
name: Option::from("Jack Sancho".to_string()),
age: Option::from(22),
address: Option::from("England".to_string()),
email: Option::from("jacksemail@gmail.com".to_string()),
dept_id: 102,
salary: Option::from(BigDecimal::from(80000.00)),
created_on: Option::from(Utc::now().naive_utc()),
created_by: Option::from("Tom".to_string()),
modified_on: None,
modified_by: None,
is_active: Option::from(true),
},
Employee {
employee_id: 1003,
name: Option::from("Phil Foden".to_string()),
age: Option::from(29),
address: Option::from("England".to_string()),
email: Option::from("philsemail@gmail.com".to_string()),
dept_id: 101,
salary: Option::from(BigDecimal::from(80000.00)),
created_on: Option::from(Utc::now().naive_utc()),
created_by: Option::from("Tom".to_string()),
modified_on: None,
modified_by: None,
is_active: Option::from(true),
},
]
}
}
fn main() {
let department: Vec<Department> = Department::get_departments();
for dept in department {
println!(
"Dept Id: {} and Dept Name: {}",
dept.dept_id,
dept.dept_name.unwrap_or_default()
);
}
let employee: Vec<Employee> = Employee::get_employees();
for emp in employee {
println!(
"Name is: {} and age is : {}",
emp.name.unwrap_or_default(),
emp.age.unwrap_or_default()
)
}
}
fn main(){
let department:Vec=department::get_departments();
部门中的部门{
普林顿(
“部门Id:{}和部门名称:{}”,
部门id,
dept.dept\u name.unwrap\u或\u default()
);
}
让employee:Vec=employee::get_employees();
雇员的环境管理计划{
普林顿(
“姓名:{},年龄:{}”,
emp.name.unwrap_或_default(),
emp.age.unwrap_或_default()
)
}
}
此处“dept_id”将用作外键main.rs中的代码工作正常。我得到的是部门和员工,但我如何在这两个向量上执行联接
注意:目前我没有使用diesel orm。仅希望对这些向量执行联接。
有可能生锈吗?
谢谢如果您只想获得部门和员工姓名的
&str
对,您可以使用如下迭代器链:
let department: Vec<Department> = Department::get_departments();
let employee: Vec<Employee> = Employee::get_employees();
let dept_employee_names = department.iter().flat_map(|d| {
let dept_id = d.dept_id;
let dept_name = &d.dept_name;
employee
.iter()
.filter(move |e| e.dept_id == dept_id)
.map(move |e| {
(
dept_name.as_deref().unwrap_or_default(),
e.name.as_deref().unwrap_or_default(),
)
})
});
for (dept, emp) in dept_employee_names {
println!("dept = {}, emp = {}", dept, emp);
}
let department:Vec=department::get_departments();
让employee:Vec=employee::get_employees();
让dept_employee_names=department.iter().flat_map(| d|{
设dept\u id=d.dept\u id;
让dept\u name=&d.dept\u name;
雇员
.国际热核实验堆(iter)
.filter(移动| e | e.dept_id==部门id)
.map(移动| e |{
(
部门名称作为默认值()展开或默认值(),
e、 name.as_deref().unwrap_或_default(),
)
})
});
部门员工姓名中的(部门、emp){
println!(“dept={},emp={},dept,emp);
}
请注意,这必须搜索所有员工