Sql 如何从一个表中获取最大值,然后使用EntityFramework 6连接另一个表
我有两个表Sql 如何从一个表中获取最大值,然后使用EntityFramework 6连接另一个表,sql,entity-framework,entity-framework-6,Sql,Entity Framework,Entity Framework 6,我有两个表stock和stockprice。我想使用EntityFramework6获取所有股票的最近更新价格 我首先从股票中选择*,然后使用foreach获取每个符号的最后更新价格。如何使用EntityFramework6只使用一个查询就可以做到这一点 股票: Id Symbol ------------- 1 AAPL 2 MSFT Id Symbol Price LastUpdatedDate --------------------------
stock
和stockprice
。我想使用EntityFramework6获取所有股票的最近更新价格
我首先从股票中选择*
,然后使用foreach获取每个符号的最后更新价格。如何使用EntityFramework6只使用一个查询就可以做到这一点
股票:
Id Symbol
-------------
1 AAPL
2 MSFT
Id Symbol Price LastUpdatedDate
-------------------------------------
1 AAPL 120 11/7/2016
2 AAPL 121 11/2/2016
3 AAPL 123 11/3/2016
4 MSFT 111 11/2/2016
5 MSFT 101 11/6/2016
股票价格:
Id Symbol
-------------
1 AAPL
2 MSFT
Id Symbol Price LastUpdatedDate
-------------------------------------
1 AAPL 120 11/7/2016
2 AAPL 121 11/2/2016
3 AAPL 123 11/3/2016
4 MSFT 111 11/2/2016
5 MSFT 101 11/6/2016
我想得到每个符号的最新价格
AAPL 120 11/7/2016
MSFT 101 11/6/2016
如果您有具有属性的对象列表 Id、符号、价格、上次更新日期 比方说
List<ItemPrice> itemPrice
我希望它能帮助您如果您有具有属性的对象列表 Id、符号、价格、上次更新日期 比方说
List<ItemPrice> itemPrice
我希望它能对您有所帮助。注意:我知道您更喜欢纯EF解决方案,但这是另一种方式,我认为它将更具可扩展性和可支持性 查询:
Select A.Symbol, C.Price, A.MaxDate
(
Select Max(LastUpdatedDate) as MaxDate, Symbol
FROM stockprice A INNER JOIN stock B on A.Symbol = B.Symbol
Group By Symbol
) A
INNER JOIN StockPrice C on A.Symbol = C.Symbol AND A.MaxDate = C.LastUpdatedDate
Create View vStockPrice AS
Select A.Symbol, C.Price, A.MaxDate
(
Select Max(LastUpdatedDate) as MaxDate, Symbol
FROM stockprice A INNER JOIN stock B on A.Symbol = B.Symbol
Group By Symbol
) A
INNER JOIN StockPrice C on A.Symbol = C.Symbol AND A.MaxDate = C.LastUpdatedDate
Go
要创建视图:
Select A.Symbol, C.Price, A.MaxDate
(
Select Max(LastUpdatedDate) as MaxDate, Symbol
FROM stockprice A INNER JOIN stock B on A.Symbol = B.Symbol
Group By Symbol
) A
INNER JOIN StockPrice C on A.Symbol = C.Symbol AND A.MaxDate = C.LastUpdatedDate
Create View vStockPrice AS
Select A.Symbol, C.Price, A.MaxDate
(
Select Max(LastUpdatedDate) as MaxDate, Symbol
FROM stockprice A INNER JOIN stock B on A.Symbol = B.Symbol
Group By Symbol
) A
INNER JOIN StockPrice C on A.Symbol = C.Symbol AND A.MaxDate = C.LastUpdatedDate
Go
使用存储过程执行此操作:
Create Procedure usp_StockPrice AS
Begin
Select A.Symbol, C.Price, A.MaxDate
(
Select Max(LastUpdatedDate) as MaxDate, Symbol
FROM stockprice A INNER JOIN stock B on A.Symbol = B.Symbol
Group By Symbol
) A
INNER JOIN StockPrice C on A.Symbol = C.Symbol AND A.MaxDate = C.LastUpdatedDate
END
然后,您只需像使用EF查询任何表一样查询视图,或者使用该进程调用存储过程
var query = from rows in vStockPrice select ..... ;
在View或SP中执行此操作的优点是,您可以通过简单地更改基本查询来处理将来对需求的任何更改。(假设你想忽略低价股,那么只需要一个where子句:where price>1.0)。您不必重新编译C代码(您的DBA出于其他原因会喜欢这种方法!!)
如果您希望我扩展(或者您认为这不相关),请告诉我。注意:我知道您更喜欢纯EF解决方案,但这是另一种方式,我认为它将更具可扩展性和可支持性 查询:
Select A.Symbol, C.Price, A.MaxDate
(
Select Max(LastUpdatedDate) as MaxDate, Symbol
FROM stockprice A INNER JOIN stock B on A.Symbol = B.Symbol
Group By Symbol
) A
INNER JOIN StockPrice C on A.Symbol = C.Symbol AND A.MaxDate = C.LastUpdatedDate
Create View vStockPrice AS
Select A.Symbol, C.Price, A.MaxDate
(
Select Max(LastUpdatedDate) as MaxDate, Symbol
FROM stockprice A INNER JOIN stock B on A.Symbol = B.Symbol
Group By Symbol
) A
INNER JOIN StockPrice C on A.Symbol = C.Symbol AND A.MaxDate = C.LastUpdatedDate
Go
要创建视图:
Select A.Symbol, C.Price, A.MaxDate
(
Select Max(LastUpdatedDate) as MaxDate, Symbol
FROM stockprice A INNER JOIN stock B on A.Symbol = B.Symbol
Group By Symbol
) A
INNER JOIN StockPrice C on A.Symbol = C.Symbol AND A.MaxDate = C.LastUpdatedDate
Create View vStockPrice AS
Select A.Symbol, C.Price, A.MaxDate
(
Select Max(LastUpdatedDate) as MaxDate, Symbol
FROM stockprice A INNER JOIN stock B on A.Symbol = B.Symbol
Group By Symbol
) A
INNER JOIN StockPrice C on A.Symbol = C.Symbol AND A.MaxDate = C.LastUpdatedDate
Go
使用存储过程执行此操作:
Create Procedure usp_StockPrice AS
Begin
Select A.Symbol, C.Price, A.MaxDate
(
Select Max(LastUpdatedDate) as MaxDate, Symbol
FROM stockprice A INNER JOIN stock B on A.Symbol = B.Symbol
Group By Symbol
) A
INNER JOIN StockPrice C on A.Symbol = C.Symbol AND A.MaxDate = C.LastUpdatedDate
END
然后,您只需像使用EF查询任何表一样查询视图,或者使用该进程调用存储过程
var query = from rows in vStockPrice select ..... ;
在View或SP中执行此操作的优点是,您可以通过简单地更改基本查询来处理将来对需求的任何更改。(假设你想忽略低价股,那么只需要一个where子句:where price>1.0)。您不必重新编译C代码(您的DBA出于其他原因会喜欢这种方法!!)
如果您想让我扩展(或者您认为这不相关),请告诉我。试试这个
using(var db= new DbContext())
{
//This will fetch all your stock and include all corresponding StockPrices.
var stockWithPrices = db.Stock
.Select(x=> new
{
Name = x. Name
Price = x.StockPrices.OrderByDescending(y=>y.LastUpdatedDate).FirstOrDefault().Price
Date = x.StockPrices.OrderByDescending(y=>y.LastUpdatedDate).FirstOrDefault().Date
}.ToList();
}
假设你的模型是这样的
var lastUpdated= from item in itemPrice
group item by item.Symbol into itemGroup
let maxDate = itemGroup.Max(gt => gt.LastUpdatedDate)
select new RegistrationModel
{
Symbol = itemGroup.Key,
LastUpdatedDate= maxDate,
Price= itemGroup.First(gt2 => gt2.ExpiryDateAD == maxDate).Price
}).ToList()
public partial class Stock
{
public int Id {get;set;}
public string Symbol {get;set;}
public ICollection<StockPrice> StockPrices {get;set;}
}
公共部分类股票
{
公共int Id{get;set;}
公共字符串符号{get;set;}
公共ICollection股票价格{get;set;}
}
试试这个
using(var db= new DbContext())
{
//This will fetch all your stock and include all corresponding StockPrices.
var stockWithPrices = db.Stock
.Select(x=> new
{
Name = x. Name
Price = x.StockPrices.OrderByDescending(y=>y.LastUpdatedDate).FirstOrDefault().Price
Date = x.StockPrices.OrderByDescending(y=>y.LastUpdatedDate).FirstOrDefault().Date
}.ToList();
}
假设你的模型是这样的
var lastUpdated= from item in itemPrice
group item by item.Symbol into itemGroup
let maxDate = itemGroup.Max(gt => gt.LastUpdatedDate)
select new RegistrationModel
{
Symbol = itemGroup.Key,
LastUpdatedDate= maxDate,
Price= itemGroup.First(gt2 => gt2.ExpiryDateAD == maxDate).Price
}).ToList()
public partial class Stock
{
public int Id {get;set;}
public string Symbol {get;set;}
public ICollection<StockPrice> StockPrices {get;set;}
}
公共部分类股票
{
公共int Id{get;set;}
公共字符串符号{get;set;}
公共ICollection股票价格{get;set;}
}
请告诉我您是否同意使用存储过程或视图来获得所需的结果(您可以从Entity Framework调用这些结果)@objectNotFound,我不喜欢使用SP或视图。但是,如果使用实体框架做这件事太难,我对SP持开放态度。在SP或视图中做这件事很容易。。。我认为这应该是正确的方法。我将发布查询,您可以决定是否将其作为解决方案。请告诉我您是否可以使用存储过程或视图来获得所需的结果(然后可以从实体框架调用该结果)@objectNotFound,我不喜欢使用SP或视图。但是,如果使用实体框架做这件事太难,我对SP持开放态度。在SP或视图中做这件事很容易。。。我认为这应该是正确的方法。我将发布查询,您可以决定是否保留它作为解决方案