Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
C# LINQ到实体而不是存储过程?_C#_Linq_Entity Framework_Stored Procedures_Entity Framework 4 - Fatal编程技术网

C# LINQ到实体而不是存储过程?

C# LINQ到实体而不是存储过程?,c#,linq,entity-framework,stored-procedures,entity-framework-4,C#,Linq,Entity Framework,Stored Procedures,Entity Framework 4,我正在使用实体框架访问我的数据库,我刚刚发现将存储过程映射到使用实体的方法有点太复杂了,可能不太适合做我想做的事情。我是LINQ的新手,我想知道如果我只使用ADO.NET是否会更好。以下是我需要翻译的SQL代码: SELECT p.Player_id, p.Name, p.Position, SUM(s.Goals) AS goalsb, SUM(s.Assists) AS assistsb, SUM(s.Points) AS pointsb FROM Dim_Player AS p INNER

我正在使用实体框架访问我的数据库,我刚刚发现将存储过程映射到使用实体的方法有点太复杂了,可能不太适合做我想做的事情。我是LINQ的新手,我想知道如果我只使用ADO.NET是否会更好。以下是我需要翻译的SQL代码:

SELECT p.Player_id, p.Name, p.Position, SUM(s.Goals) AS goalsb, SUM(s.Assists) AS assistsb, SUM(s.Points) AS pointsb
FROM Dim_Player AS p INNER JOIN Fact_Statistics AS s ON s.Player_id = p.Player_id
GROUP BY p.Player_id, p.Name, p.Position
ORDER BY pointsb DESC, goalsb DESC
通过存储过程的实体映射,我编写了以下代码:

HockeyStatsEntities db = new HockeyStatsEntities();

public ActionResult Index()
{
    ViewBag.Message = "League leaders";
    {
        return View(db.ListLeagueLeaders());
    }
}

public ActionResult About()
{
    return View();
}

private ICollection<ListLeagueLeaders_Result> ListLeagueLeaders()
{
    ICollection<ListLeagueLeaders_Result> leagueLeadersCollection = null;

    using (HockeyStatsEntities context = new HockeyStatsEntities())
    {
        foreach (ListLeagueLeaders_Result leagueLeader in
                  context.ListLeagueLeaders())
        {
            leagueLeadersCollection.Add(leagueLeader);
        }
    }
    return leagueLeadersCollection;
}
HockeyStatEntities db=新的HockeyStatEntities();
公共行动结果索引()
{
ViewBag.Message=“联盟领袖”;
{
返回视图(db.ListLeagueLeaders());
}
}
关于()的公共行动结果
{
返回视图();
}
私人ICollection ListLeagueLeaders()
{
ICollection leagueLeadersCollection=null;
使用(hockeyStatEntities context=new hockeyStatEntities())
{
foreach(列表联盟领袖)\结果联盟领袖
context.ListLeagueLeaders())
{
leagueLeadersCollection.Add(leagueLeader);
}
}
返回LeagueLeaders集合;
}
以下是我得到的错误:

传递到字典中的模型项的类型为 'System.Data.Objects.ObjectResult'1[NHLStats2.Models.ListLeagueLeaders\u结果], 但此词典需要类型为的模型项 “NHLStats2.Models.ListLeagueLeaders_结果”


但我意识到这对我来说有点痛苦。。。我如何使用不同的、更有效的方法来重新安排?感谢您的帮助,非常感谢。

您可以编写一个简单的LINQ查询,使用具有以下两个表的模型,保持它们之间的关系:

from p in ctx.Dim_Player
select new {p.Player_id, p.Name, Goals = p.Fact_Statstics.Select(x=>(int?)x.Goals).Sum()}
玩家将拥有FactStatistics属性和相关统计信息。可以使用所需的总和和计数应用子查询

上面的查询返回的是匿名类型,但您可以创建具有所需属性的类


使用(int?)cast很重要。

您可以编写一个简单的LINQ查询,使用带有这两个表的模型,保持它们的关系:

from p in ctx.Dim_Player
select new {p.Player_id, p.Name, Goals = p.Fact_Statstics.Select(x=>(int?)x.Goals).Sum()}
玩家将拥有FactStatistics属性和相关统计信息。可以使用所需的总和和计数应用子查询

上面的查询返回的是匿名类型,但您可以创建具有所需属性的类


使用(int?)cast很重要。

最后选择使用存储过程,它编译并工作:

Model1.tt.Context.cs(自动生成)

public DbSet Dim_Date{get;set;}
公共DbSet Dim_播放器{get;set;}
公共DbSet Dim_团队{get;set;}
公共数据库集事实统计{get;set;}
公共DbSet Dim_对策{get;set;}
公共虚拟对象结果ListLeagueLeaders()
{
((IObjectContextAdapter)this.ObjectContext.MetadataWorkspace.LoadFromAssembly(typeof(ListLeagueLeaders_Result).Assembly);
返回((IObjectContextAdapter)this.ObjectContext.ExecuteFunction(“ListLeagueLeaders”);
}
查看

@model System.Data.Objects.ObjectResult<NHLStats2.Models.ListLeagueLeaders_Result>

@{
    ViewBag.Title = "Index";
}

[...]
@model System.Data.Objects.ObjectResult
@{
ViewBag.Title=“Index”;
}
[...]

问题在于强类型视图类型与System.Data.Objects.ObjectResult类型不匹配。Was:
@model NHLStats2.Models.listleague leaders_Result
,更改为:
@model System.Data.Objects.ObjectResult
干杯

最后选择使用存储过程,它编译并工作:

Model1.tt.Context.cs(自动生成)

public DbSet Dim_Date{get;set;}
公共DbSet Dim_播放器{get;set;}
公共DbSet Dim_团队{get;set;}
公共数据库集事实统计{get;set;}
公共DbSet Dim_对策{get;set;}
公共虚拟对象结果ListLeagueLeaders()
{
((IObjectContextAdapter)this.ObjectContext.MetadataWorkspace.LoadFromAssembly(typeof(ListLeagueLeaders_Result).Assembly);
返回((IObjectContextAdapter)this.ObjectContext.ExecuteFunction(“ListLeagueLeaders”);
}
查看

@model System.Data.Objects.ObjectResult<NHLStats2.Models.ListLeagueLeaders_Result>

@{
    ViewBag.Title = "Index";
}

[...]
@model System.Data.Objects.ObjectResult
@{
ViewBag.Title=“Index”;
}
[...]
问题在于强类型视图类型与System.Data.Objects.ObjectResult类型不匹配。Was:
@model NHLStats2.Models.listleague leaders_Result
,更改为:
@model System.Data.Objects.ObjectResult
干杯