[英]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.