簡體   English   中英

使用實體框架執行自定義 sql?

[英]execute custom sql with entity framework?

我需要執行一個自定義查詢,該查詢將保存在數據庫中的某個位置,我需要它返回到數據表或數據集中,並將其綁定到一個網格視圖,該網格視圖會將自動生成的列設為 true。

我所有的數據訪問層與實體框架完美配合,但對於某些特定場景,我需要這樣做,我想知道是否應該將 ado.net 與實體框架結合起來,或者 EF 是否可以以某種方式做到這一點

對於實體框架 5使用

上下文.數據庫.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();


}

這是另一個維度和更簡單的方法。 使用您的實體框架上下文獲取 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

如果您的目標是返回 ADO.NET 結構(DataTable 或 DataSet),那么只需使用經典的 ADO.NET。 您會發現這比嘗試將數據綁定到實體集然后自己填充 DataTable 或 DataSet 更容易。

但是,如果您真的非常有興趣通過 EntityFramework 運行自定義查詢,請查看ExecuteQuery 它允許您執行 SQL 查詢並將結果映射回模型中的實體。 然后,您需要練習獲取 IEnumerable 結果並將其映射到 DataTable 或 DataSet。 因此,我最初的回答是“用好的老式 ADO.NET 方法來做”。

我使用 EF6,有一天我需要一種方法來執行動態 SQL 字符串並獲取 DataTable。 首先,我只是將DbContext.Database.ConnectionSqlConnection並完成了整個工作。 它適用於測試,但應用程序已損壞,因為我們使用的 Glimpse 注入了類型為Glimpse.Ado.AlternateType.GlimpseDbConnectionDbConnection自我實現。 我需要獨立於 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM