【问题标题】:C# Linq to Entity Framework multiple unrelated queriesC# Linq to Entity Framework 多个不相关的查询
【发布时间】:2016-03-02 05:40:10
【问题描述】:

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

表 1 - 包含需要在前端 html 上显示的列列表,角剑道网格 - 可通过单独的管理员配置进行配置。

表2(其他一些表的连接)-有需要在角度前端显示的数据。

我目前使用的 linq 如下。

查询 1:获取要在 Grid 上显示的列列表

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

目前,从我的用户界面中,我已经进行了两次 api 调用,一次用于列,一次用于获取实际数据,并显示/隐藏列表中配置的列。

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

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

我搜索了很多关于如何使用配置的列生成动态 linq 选择的资源。

请有人帮我解决这个问题

【问题讨论】:

  • 您的 Angular UI 正在调用 Web API,而 Web API 又依次调用 SQL,对吗?并且您以某种格式(可能是 JSON 格式)将数据返回到 UI?那么你想在哪里加密?在客户端和 Web API 之间还是在 Web API 和 SQL 之间?
  • @Viru 我认为他想过滤数据,这样就不会从服务器传输敏感数据,而不仅仅是加密它,这会让任何用户在浏览器调试工具中看到敏感数据。跨度>
  • @JoachimIsaksson 明白了,谢谢
  • @Shashi 那么哪些列被配置为显示/隐藏......数据库中是否有这些信息?还是在某个配置文件中?
  • @Viru 是的,数据以 JSON 格式返回到 ui,配置在数据库中,我不希望数据被加密,因为它与我在配置时想要显示的数据相同显示

标签: c# .net entity-framework linq kendo-asp.net-mvc


【解决方案1】:

你可以做这样的事情。假设您的列表显示一个布尔列,当它为 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 调用的一部分,该调用将执行两个 SQL 调用,一个用于获取列,另一个用于获取数据,然后您将使用 Linq To Entity 过滤您不想要的列(或想要他们为空)。将此过滤后的数据返回给 UI。

【讨论】:

  • 我已经尝试过了,但它不起作用,因为它试图从外部访问集合我收到一个错误,提示无法找到 linq to entity。
  • 我知道我认为您必须完全获取数据并具体化查询,然后使用其他查询来过滤列...将在几分钟内发布更新的代码
  • 错误:无法创建“匿名类型”类型的常量值。只有原始类型或枚举类型是
  • 您实现了查询吗?对 Linq 查询都执行 ToList 很重要……你能发布更新代码吗?
  • 我已经完成了第一个查询的列表,我不能做第二个查询的列表,因为我希望我的方法返回 kendo 映射器的 iqueryable 类型以允许服务器端排序和过滤
猜你喜欢
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多