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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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_Rust_Traits_Rust Cargo_Rust Diesel - Fatal编程技术网

Linq 什么是“林克”;加入;铁锈的当量?

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语

我正在尝试对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);
}
请注意,这必须搜索所有员工