C# Linq 到实体框架多个不相关的查询
本文关键字:不相关 查询 框架 Linq 实体 | 更新日期: 2023-09-27 18:36:56
我遇到需要来自多个数据库表的数据的情况。
表 1 - 具有需要在前端 html、角度剑道网格上显示的列列表 - 可从单独的管理配置进行配置。
表2(连接其他一些表)- 具有需要在角度前端显示的数据。
我目前使用的linq如下。
查询 1:获取要在网格上显示的列的列表
var columns = from cols in _context.columns
select cols.colNames;
查询 2:获取列表的实际数据
var data = from cust in _context.customer
join details in _context.custDetails on cust.id equals details.custid
join o in _context.orders on cust.id equals o.custid
where cust.id == XXXX
select new Customer
{
Id = cust.Id,
Name = cust.Name,
Address = details.Address,
City = details.City,
State = details.State,
OrderDate = o.OrderDate,
Amount = o.Amount
//15 other properties similarly
};
将 IQueryable 类型返回到 Kendo 数据源请求
目前,从我的 ui 中,我已经进行了两次 api 调用,一个用于列,一个用于获取实际数据,并显示/隐藏在列表中配置的列。
但问题是,如果有人查看网络或浏览器工具上的 api 调用,他们可以看到要隐藏的列返回的数据,这是一个安全问题。
我正在为我的 api 寻找一个查询,它使用第二个查询返回数据,该查询应该足够智能,可以仅发送已配置列的数据(可能有 30 个不同的列)并将其他属性设置为 null 或根本不选择它们。 有些属性需要始终返回,因为它们用于其他目的。
我搜索了许多有关如何使用配置的列生成动态 linq select 的资源。
请有人帮助我解决这个问题
你可以做这样的事情。假设您的列表为布尔列显示,当它为真时,将显示列,当它为假时,它不会显示。
var columns = (from cols in _context.columns
select cols).ToList(); // note I am getting everything not just column names here...
var data = from cust in _context.customer
join details in _context.custDetails on cust.id equals details.custid
join o in _context.orders on cust.id equals o.custid
where cust.id == XXXX
select new Customer
{
Id = cust.Id,
Name = cust.Name,
Address = details.Address,
City = details.City,
State = details.State,
OrderDate = o.OrderDate,
Amount = o.Amount
//15 other properties similarly
}.ToList();
var fileterdData = from d in data
select new Customer
{
Id = DisplayColumn("ID",columns)? cust.Id:null,
Name = DisplayColumn("Name",columns)? cust.Name:null,
Address = DisplayColumn("Address",columns)? details.Address:null,
// do similarly for all other columns
}.AsQueryable(); // returns IQueryable<Customer>
private bool DisplayColumnn(string columnName,List<Columns> cols)
{
return cols.Where(x=>x.ColumnName==columnName).First().Display();
}
因此,现在您将将此代码作为一次 Web API 调用的一部分,该调用将执行两个 SQL 调用,一次用于获取列,另一个用于获取数据,然后您将使用 Linq To 实体筛选器列,这些列不需要(或希望它们为 null)。 将此筛选的数据返回到 UI。