簡體   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