簡體   English   中英

在EF中使用SQL查詢

[英]Using sql queries in EF

我通過以下方式從數據庫獲取數據:

 result = (from d in context.FTDocuments
                          join f in context.FTDocFlags on d.ID equals f.DocID into fgrp
                          from x in fgrp.DefaultIfEmpty()
                          where d.LevelID == levelID && x.UserID == userID && d.Status.Equals(DocumentStatus.NEW)
                          select new Entities.Document
                          {
                              ArrivalDate = d.ArrivalDate.Value,
                              BundleReference = d.BundleRef,
                              CreatedDate = d.CreatedDate,
                              CustomerID = d.CustomerID,
                              DocType = d.DocType.Value,
                              GuidID = d.DocGuid,
                              ID = d.ID,
                              LastExportID = d.LastExpID,
                              LevelID = d.LevelID,
                              ProfileID = d.ProfileID,
                              ScanDate = d.ScanDate.Value,
                              ScanOperator = d.ScanOperator,
                              SenderEmail = d.SenderEmail,
                              Status = d.Status,
                              VerifyOperator = d.VerOperator,
                              FlagNo = x == null ? 0 : x.FlagNo,
                              FlagUserID = x == null ? 0 : x.UserID
                          }).ToList();

現在,我嘗試通過使用sql查詢來實現這一點:

var test = context.Database.SqlQuery<string>("select *from FTDocument d left outer join FTDocFlag f on d.ID=f.DocID").ToList();

但是出現以下錯誤:

數據讀取器具有多個字段。 多個字段對於EDM原語或枚舉類型無效

是否可以使用上述復雜查詢?

我使用EF 6.0。

您的查詢不返回單個字符串。 使用方式如下:

var test = context.Database.SqlQuery<Entities.Document>("...");

嘗試這個

const string query = @"select *from FTDocument d left outer join FTDocFlag f on d.ID=f.DocID";

var test = context.Database.SqlQuery<Entity>(query).ToList();

在我的回答中,我首先假定了EntitityFramework(ObjectContext) ,但隨后我還添加了DbContext的代碼。

要查看下面的示例,可以使用LinqPad並通過添加連接使用EntitityFramework(ObjectContext)添加實體框架DLL 指定連接屬性並關閉連接對話框。 然后選擇連接並運行示例:

void Main()
{
    var context=this; // requires that you selected an EF ObjectContext connection  
    var q=context.ExecuteStoreQuery<FTDocument>(
                                   "SELECT * FROM FTDocument WHERE ID = @p0", 1);
    q.ToList().Dump();
}

它將接受所有類型的SQL查詢,並且您可以使用@p0@p1等參數,並在調用ExecuteStoreQuery函數時將它們以逗號分隔即可。 結果將作為List<FTDocument>返回。 要將其轉換為List<string>您需要指定要返回的數據庫字段-或在每行中創建一個用逗號分隔的字段值列表,例如:

    q.Select(s=>s.ID+", "+s.GuidID+", "+s.DocType).ToList().Dump();

相同的示例,但是這次使用EntityFramework(DbContext)

通過添加連接使用EntitityFramework(DbContext V4 / V5 / V6)添加您的Entity Framework DLL 指定連接屬性(不要忘記指定AppConfig文件)並關閉連接對話框。 然后選擇連接並運行示例:

void Main()
{
    var context=this; // requires that you selected an EF DBContext (V4/5/6) connection 
    var q=context.Database.SqlQuery<FTDocument>(
                               "SELECT * FROM FTDocument WHERE ID = @p0", 1);
    q.ToList().Dump();
}

提示:關閉連接對話框之前,請單擊“ 測試” 如果您知道連接成功,將在以后減輕您的頭痛。 對於所有想要在具有您自己的數據庫的其他EF項目中進行嘗試的人, 這里有一個快速的教程如何創建它。 然后只需將上面示例中的FTDocument替換為您選擇的其他表即可(當然,在SQL字符串和方括號<...>中)。

暫無
暫無

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

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