与实体框架执行自定义的SQL?(execute custom sql with entity fra

2019-06-25 04:51发布

我需要执行哪些港岛线某处在数据库中保存一个customquery,我需要它在数据表或数据集返回,并将其绑定到GridView这将有自动生成列真。

我所有的数据访问层可以完美兼容实体框架,但对于一些特定情况下,我需要做到这一点,我不知道我是否应该与实体框架结合ado.net,或者EF能以某种方式做到这一点

Answer 1:

如果你的目标是返回ADO.NET结构(数据表或数据集),那么就使用ADO.NET的经典。 你会发现它不是试图将数据绑定到一个实体集,然后填充一个DataTable或数据集自己更容易。

不过,如果你真的成为贯穿的EntityFramework自定义查询兴趣,看一看的executeQuery 。 它可以让你执行一个SQL查询和结果映射回模型中的实体。 那么这将是你的一部分演习采取了IEnumerable结果,并将其映射到数据表或数据集。 因此,我原来的“只管去做好的醇”老式ADO.NET的方法。”答案



Answer 2:

对于实体框架5使用

context.Database.SqlQuery


实体框架4使用下面的代码

context.ExecuteStoreQuery


 public string BuyerSequenceNumberMax(int buyerId)
    {
        string sequenceMaxQuery = "SELECT TOP(1) btitosal.BuyerSequenceNumber FROM BuyerTakenItemToSale btitosal " +
                                  "WHERE btitosal.BuyerID =  " + buyerId +
                                  "ORDER BY  CONVERT(INT,SUBSTRING(btitosal.BuyerSequenceNumber,7, LEN(btitosal.BuyerSequenceNumber))) DESC";

        var sequenceQueryResult = context.Database.SqlQuery<string>(sequenceMaxQuery).FirstOrDefault();

        string buyerSequenceNumber = string.Empty;

        if (sequenceQueryResult != null)
        {
            buyerSequenceNumber = sequenceQueryResult.ToString();
        }

        return buyerSequenceNumber;
    }

对于返回一个列表使用下面的代码

 public List<PanelSerialList> PanelSerialByLocationAndStock(string locationCode, byte storeLocation, string itemCategory, string itemCapacity, byte agreementType, string packageCode)
 {
       string panelSerialByLocationAndStockQuery = "SELECT isws.ItemSerialNo,  im.ItemModel " +
        "FROM Inv_ItemMaster im   " +
        "INNER JOIN  " +
        "Inv_ItemStockWithSerialNoByLocation isws  " +
        "   ON im.ItemCode = isws.ItemCode   " +
        "       WHERE isws.LocationCode = '" + locationCode + "' AND  " +
        "   isws.StoreLocation = " + storeLocation + " AND  " +
        "   isws.IsAvailableInStore = 1 AND " +
        "   im.ItemCapacity = '" + itemCapacity + "' AND " +
        "   isws.ItemSerialNo NOT IN ( " +
        "           Select sp.PanelSerialNo From Special_SpecialPackagePriceForResale sp  " +
        "           Where sp.PackageCode = '" + packageCode + "' )";



    context.Database.SqlQuery<PanelSerialList>(panelSerialByLocationAndStockQuery).ToList();


}


Answer 3:

这里的另一个维度和更简单的方法。 使用实体框架上下文获取SQL连接:

var connection = (System.Data.SqlClient.SqlConnection) _db.Database.Connection;

if (connection != null && connection.State == ConnectionState.Closed)
{
    connection.Open();
}

var dt = new DataTable();

using (var com = new System.Data.SqlClient.SqlDataAdapter("Select * from Table", connection))
{
    com.Fill(dt);
}

我们可以使用DataAdapter或任何其他传统方法来执行使用EF连接查询。

这将是非常有用的,当我们做一些动态的,当我们不能映射到实体。 我们可以得到的东西,例如一个DataTable。

上面的语法是用于EF 5.0。



Answer 4:

我用EF6有一天我需要的方式来执行动态SQL字符串,并获得数据表。 首先,我只是投DbContext.Database.ConnectionSqlConnection ,做整体的工作。 它的工作做检查,但申请被打破,因为一瞥,我们使用,注入的自我实现DbConnectionGlimpse.Ado.AlternateType.GlimpseDbConnection 。 我需要的做法是独立工作的的DbConnection是什么。 最后,我结束了下面的代码:

public class SqlDataProvider : ISqlDataProvider
{
    private readonly DbContext _context;

    public SqlDataProvider(DbContext context)
    {
        _context = context;
    }

    public DataTable GetDataTable(string sqlQuery)
    {
        try
        {
            DbProviderFactory factory = DbProviderFactories.GetFactory(_context.Database.Connection);

            using (var cmd = factory.CreateCommand())
            {
                cmd.CommandText = sqlQuery;
                cmd.CommandType = CommandType.Text;
                cmd.Connection = _context.Database.Connection;
                using (var adapter = factory.CreateDataAdapter())
                {
                    adapter.SelectCommand = cmd;

                    var tb = new DataTable();
                    adapter.Fill(tb);
                    return tb;
                }
            }
       }
        catch (Exception ex)
        {
            throw new SqlExecutionException(string.Format("Error occurred during SQL query execution {0}", sqlQuery), ex);
        }
    }

这适用于任何情况下:用于测试,其中DbContext.Database.ConnectionSqlConnectionGlimpse.Ado.AlternateType.GlimpseDbConnection



文章来源: execute custom sql with entity framework?