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 的资源。

请有人帮助我解决这个问题

C# Linq 到实体框架多个不相关的查询

你可以做这样的事情。假设您的列表为布尔列显示,当它为真时,将显示列,当它为假时,它不会显示。

 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。