繁体   English   中英

C#Linq to Entity Framework多个不相关的查询

[英]C# Linq to Entity Framework multiple unrelated queries

我遇到需要多个数据库表中的数据的情况。

表1-具有需要在前端html,角度剑道网格上显示的列的列表-可通过单独的Admin配置进行配置。

表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 DataSourceRequest

当前,从我的ui中,我进行了两个api调用,一个用于列,一个用于获取实际数据,并显示/隐藏在columns表中配置的列。

但是问题是,如果有人在网络或浏览器工具上查看api调用,他们可能会看到要隐藏的列返回的数据,这是一个安全问题。

我正在为我的api查找单个查询,该查询使用第二个查询返回数据,该查询应该足够聪明以仅发送已配置列(可能有30个不同的列)的数据,并将其他属性设置为null或不选择他们。 有些属性在用于其他目的时总是需要返回。

我搜索了许多资源,以了解如何使用已配置的列生成动态linq select。

请有人帮我解决这个问题

你可以做这样的事情。 假设您的列表是布尔列Display,则为true时将显示列,为false时将不显示。

 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调用的一部分,该Web API调用将执行两个SQL调用,一个用于获取列,另一个用于获取数据,然后您将使用Linq To Entity过滤器来过滤不需要的列(或希望它们为null )。 将此过滤后的数据返回给UI。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM