2016-03-02 74 views
0

我有一种情况,我需要来自多个数据库表的数据。C#Linq to Entity Framework多个不相关的查询

表1 - 列表需要在前端html,角度kendo网格上显示的列 - 可以通过单独的管理配置进行配置。

表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类型剑道DataSourceRequest

目前,从我的用户界面我已经做了两个API调用一个对于列和一个用于获取实际数据,并显示/隐藏在列表中配置的列。

但问题是,如果有人着眼于网络上或在浏览器的工具,他们可以看到该退还是要隐藏这是一个安全问题列中的数据的API调用。

我正在寻找一个查询我的api返回数据使用第二个查询应该是足够智能发送数据只有配置列(可能有30个不同的列),并将其他属性设置为null或根本不选择它们。有些属性需要始终返回,因为它们被用于其他目的。

我搜索我如何能产生动态的LINQ选择使用配置的列多的资源。

请有人帮我解决这个问题

+0

您的Angular UI正在调用Web API,它反过来调用SQL,是否正确?并以某种格式将数据返回给UI(可能是JSon格式)?那么你想在哪里加密?客户端和Web API之间或Web API或SQL之间? – Viru

+0

@Viru我认为他希望过滤数据,以免从服务器传输敏感数据,而不仅仅是加密它,这会让任何用户在浏览器调试工具中看到敏感数据。 –

+0

@JoachimIsaksson雅得到它谢谢 – Viru

回答

1

你可以做这样的事情。假设你的列表是一个布尔列显示,当它是true列将被显示,当它是假的它不会被显示。

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(); 
} 

所以,现在你有这样的代码作为一个网络API调用的一部分会做两个SQL调用一个拿到柱等获得的数据,那么你会用你不Linq到实体过滤器列想要(或希望它们为空)。将过滤的数据返回给用户界面。

+0

我已经试过这个,但它不工作,因为它尝试从外部访问集合我得到一个错误,说linq实体无法找到。 – Shashi

+0

我看到我认为你必须完全获取数据并实现查询,然后使用其他查询来填充列...将在最后发布更新的代码 – Viru

+0

错误:无法创建类型为“匿名类型”的常量值。只有原始类型或枚举类型是 – Shashi