2013-08-19 69 views
1

我最近開始嘗試使用實體框架的原始SQL,在某些情況下我更喜歡它。 我想知道是否有搶關係實體的方式:實體框架原始SQL與關係實體

Dosnt工作:

var personNo = context.Person.SqlQuery("SELECT * FROM `Person` LIMIT 1").FirstOrDefault(); 

foreach(var Number in personNo.Phone) { 
    //never iterates 
} 

作品(但LINQ到實體,我不想在這種情況下):

var personNo = context.Person.FirstOrDefault(); 

foreach(var Number in personNo.Phone) { 
    //iterate twice as it contains in the db 
} 

我嘗試了幾個不同的查詢,包括

SELECT * FROM `Person` LEFT JOIN `Phone` ON (`Person`.ID = `Phone`.PersonID) LIMIT 1 

是什麼正確的方式來編寫查詢以接收電話號碼列表?這可能嗎?

+0

這可能是一個細節,但不應該在您的本機查詢中寫入'\'Person \'而不是'''''''''' – Lapidouce

+0

非常注意!謝謝,雖然複製粘貼是錯誤的 –

回答

0

您可以對實體執行SQL。當我加入並分組時,我更喜歡這種方式,並且沒有創建視圖的權限。

首先,創建一個類並添加與返回列相同名稱的屬性。

public class PersonWithAddress 
{ 
    public int Id { get; set; } 
    public String Name { get; set; } 
    public String Address { get; set; } 
} 

和C#與參數

MyEntity db = new MyEntity(); 
String sqlQuery = @" 
    SELECT Id, Name, Address 
    FROM Person p 
    JOIN Address a 
    ON a.Id = p.Id 
    WHERE Name = @Name 
    AND Address = @Address 
"; 
String searchName = "Joe"; 
String address = "123 Something Lane"; 

DbRawSqlQuery<PersonWithAddress> results = db.Database.SqlQuery<PersonWithAddress>(
    sqlQuery, 
    new SqlParameter("@Name", searchName), 
    new SqlParameter("@Address", address) 
); 

foreach(PersonWithAddress a in results) 
{ 

} 

,只要你想你可以列出許多參數。
哇這個問題的2歲。我甚至沒有意識到這一點。