Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从一个表中获取最大值,然后使用EntityFramework 6连接另一个表_Sql_Entity Framework_Entity Framework 6 - Fatal编程技术网

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或视图中做这件事很容易。。。我认为这应该是正确的方法。我将发布查询,您可以决定是否保留它作为解决方案