2012-06-27 45 views
0

我想用jaydata JSLQ(JavaScript語言查詢)扁平化的Post列表以及一個一對多PostData到我的ViewModelJayData一對多預測

我的EF實體看起來是這樣的:

public partial class Post 
{  
    public Post() 
    {   
     this.PostData = new HashSet<PostData>();   
    } 

    public int Id { get; set; } 

    public virtual ICollection<PostData> PostData { get; set; } 
} 

我的數據庫中包含這些記錄:

Table: Post 
Id;... 
1;... 

Table: PostData 
Id;PostId;FieldType; FieldValue 
1; 1;  10;  "foo" 
2; 1;  12;  "bar" 
3; 1;  34;  "blah" 

我希望我的客戶視圖模型看起來像這樣:

{id:1, title:'foo'} 

這意味着,我想在PostData上放置一個過濾器,該過濾器只返回FieldName == 10,並且我想將它扁平化爲一個簡單的對象。

我該怎麼做?

context.Posts.toArray(function(posts){console.dir(posts);}) 

返回一個post對象數組。接下來是什麼?

+0

嗨Stefan,你能粘貼你的JayData實體的定義嗎? –

回答

1

這是通過EF中的SelectMany()函數實現的,並且此方法尚未被JayData支持。但是,您可以直接查詢aganst PostData並過濾Post屬性來獲得相同的輸出。

context.PostDatas 
    .filter(function(pd) { return pd.FieldType == 10 }) 
    .map(function(pd) { return { 
        PostID: pd.Post.Id, 
        PostDataId: pd.Id, 
        Title: pd.FieldValue }}) 
    .toArray(...) 
+0

感謝您的回答。很高興知道這是行不通的(但?)。你的解決方案是一種解決方法,可能在某些情況下工作,但是當涉及到將一列帖子非規範化爲一個簡單的視圖模型列表(post.title而不是post.postdata [0] .FieldValue)時,它變得有點不方便。 – Stefan

+0

我不明白你的意思。對我來說,這個問題實際上是由郵政及其內容PostData的制定方式引起的。即該實體被存儲在一個名稱/值列表中。我知道爲什麼這種方法似乎是不可避免的(我有一些cms背景),但根據我的經驗,它總是回擊。你失去了使用索引和類型元數據信息的能力。爲了動態存儲類型化信息,sql可能不是最好的方法。 –

+0

我的意思是:你實際上需要的是一個商店,它可以讓你在運行時定義實體,以後可以讓你動態擴展這些實體而不會丟失數據。我看到它嗎?我的假設是,添加一個新的字段(類型)很少,如果從來沒有跟着c#代碼的修改。 –