C# 使用实体框架5和MVC4的自定义查询 目标

C# 使用实体框架5和MVC4的自定义查询 目标,c#,asp.net,mysql,entity-framework,asp.net-mvc-4,C#,Asp.net,Mysql,Entity Framework,Asp.net Mvc 4,在使用C#.NET+MVC4+实体框架+MySQL的应用程序中进行自定义查询 问题 我想执行一个查询并返回结果以供查看,但我不知道怎么做 我所拥有的 下面的查询返回一些productName,minProductprice,maxProductPrice(我想在我的视图中显示这个): 重复问题? 我想不是。我发现并有一个类似的标题,但似乎上下文是不同的 问题 那么,我该如何处理我的问题呢 细节 “%custom”是指实体框架创建的非默认CRUD。我之前显示的查询在默认情况下没有完成,我想执行它

在使用C#.NET+MVC4+实体框架+MySQL的应用程序中进行自定义查询

问题 我想执行一个查询并返回结果以供查看,但我不知道怎么做

我所拥有的 下面的查询返回一些
productName
minProductprice
maxProductPrice
(我想在我的视图中显示这个):

重复问题? 我想不是。我发现并有一个类似的标题,但似乎上下文是不同的

问题 那么,我该如何处理我的问题呢

细节 “%custom”是指实体框架创建的非默认CRUD。我之前显示的查询在默认情况下没有完成,我想执行它


提前谢谢

为什么不可以使用SqlDataAdapter和DataSet,因为实体框架现在知道“动态查询”,然后可以在需要的地方显示它们

希望能有所帮助。

我正在使用
ObjectContext
的方法(DbContext是从该方法派生的,用于直接执行SQL)。我不确定这是不是最好的方法,但经过多次搜索,这是我能找到的最好的方法:

public class ResultObject
{
    public string ProductName { get; set; }
    public decimal MinProductPrice { get; set; }
    public decimal MaxProductPrice { get; set; }
}

//Within your Control or somewhere common
public IList<TResult> ExecuteSql<TResult>(string sql)
{
    var results = ((IObjectContextAdapter)DbContext).ObjectContext.ExecuteStoreQuery<TResult>(sql);
    return results;
}

//Then, when you need the results, call the ExecuteSql method:
var productInfo = ExecuteSql<ResultObject>(mySql);
公共类ResultObject
{
公共字符串ProductName{get;set;}
公共十进制MinProductPrice{get;set;}
公共十进制MaxProductPrice{get;set;}
}
//在你的控制范围内或某个普通的地方
公共IList ExecuteSql(字符串sql)
{
var结果=((IObjectContextAdapter)DbContext.ObjectContext.ExecuteStoreQuery(sql);
返回结果;
}
//然后,当需要结果时,调用ExecuteSql方法:
var productInfo=ExecuteSql(mySql);

所有的标准警告都适用于内联SQL,包括擦除用户输入数据,以及它是一个坏主意(您可能应该考虑存储过程)。这也适用于存储过程,因为如果需要,您可以将参数集合传递到

ExecuteStoreQuery
方法。

在的帮助下,我可以得出结论,更简洁的方法是使用存储过程。我是个初学者,我找到了解决办法

顺便说一下,谢谢你的帮助

更新v1
by是一个教授使用EF+存储过程的好方法的职位。对于我这个初学者来说,这是一个很好的解决方案

用户输入是sql?好的,您所说的
自定义
@arturudo是什么意思?请参阅我的更新。使用linq 2实体。或者,如果不想重写查询,则将其另存为存储过程。或者只使用“纯”ado.net(google for SqlCommand或SqlDataAdapter)你好,Brian。谢谢你的加入。你引用了“存储过程”,对吗?你能给我详细介绍一下吗?关于你发布的代码,你能举例说明文件的去向吗?再次感谢你!嗨,chiefGui。关于存储过程的信息可能会占满一本书,但如果您想了解更多信息,可以开始。在互联网上有很多可以学习更多的资源。至于我提供的代码在哪里,这取决于您如何组织代码。标记表示ASP.NET MVC4,这意味着您将拥有一个控制器。如果控制器拥有EF DbContext,那么您可以将所有这些代码放在控制器中。ExecuteSql方法只需要在它可以访问DbContext的地方就可以了。谢谢关于存储过程的解释-我将阅读这篇文章。关于代码组织:
resultobect
是否将是我的产品控制器中的一个类?我找不到
ExecuteSql
也找不到
IObjectContextAdapter
——可能是命名空间?再次感谢。如果您使用ResultObject的唯一位置是在这个1控制器中,那么是的,它可以是这个控制器中的一个嵌套类。如果您需要的不仅仅是这个控制器,您可以在控制器外部声明它,以便在其他地方使用它。我已经将上面的
ExecuteStoreQuery
名称链接到了该方法的MSDN页面,因此单击它将为您提供更多详细信息。名称空间是System.Data.Objects,它位于System.Data.Entity程序集中。实际上,我将遵循您的建议:存储过程。我正在寻找它,似乎这是最好的方式。无论如何,谢谢你所做的一切。
public class ResultObject
{
    public string ProductName { get; set; }
    public decimal MinProductPrice { get; set; }
    public decimal MaxProductPrice { get; set; }
}

//Within your Control or somewhere common
public IList<TResult> ExecuteSql<TResult>(string sql)
{
    var results = ((IObjectContextAdapter)DbContext).ObjectContext.ExecuteStoreQuery<TResult>(sql);
    return results;
}

//Then, when you need the results, call the ExecuteSql method:
var productInfo = ExecuteSql<ResultObject>(mySql);