2011-03-15 120 views
1

Linq和EF4。如何將LINQ查詢從查詢​​語法轉換爲查詢方法

我在查詢語法中有這個Linq查詢我想轉換爲查詢方法。

你能做到嗎?我想更多的THA2小時沒有成功:-(

感謝您的時間

CmsContent myContentObj = (from cnt in context.CmsContents 
        from categoy in cnt.CmsCategories 
        where categoy.CategoryId == myCurrentCategoryId && cnt.ContentId == myCurrentContentId 
        select cnt).Single(); 
+1

它的拼寫語法** ** - 不是「sintax」 ...... – 2011-03-15 12:44:04

+0

感謝marc_s您評論 – GibboK 2012-11-29 08:54:39

回答

1

這是一種非直接的翻譯,我相信在執行少得多的代碼相同的任務:

var myContentObj = context.CmsContents.Single(
         x => x.ContentId == myCurrentContentId && 
         x.CmsCategories.Any(y => y.CategoryId == myCurrentCategoryId) 
        ); 
+0

嗨,它工作得很好,對我來說它非常可讀!謝謝 – GibboK 2011-03-15 13:59:07

2

我原來的答覆選擇了錯誤的項目,它是更復雜一點比我有(其中安仁已發佈)。這就是我認爲是等效的查詢和不過應該有更好的表現:

CmsContent myContentObj = 
    context.CmsContents 
      .Where(cnt => cnt.ContentId == myCurrentId 
         && cnt.CmsCategories 
          .Any(categoy => categoy.CategoryId == myCurrentCategoryId)) 
      .Single(); 
+0

嗨傑夫不工作錯誤錯誤不能隱式地將類型'CmsCategory'轉換爲'CmsContent' – GibboK 2011-03-15 12:52:08

+0

這是不正確的。 – Ani 2011-03-15 12:55:37

+0

@GibboK:啊,哎呀,忽略了被選中的內容。實際上它更像Ani所擁有的。 – 2011-03-15 12:56:19

1

這裏的C#編譯器實際上是怎麼做的,與.net反射一些幫助,以驗證:

var myContentObj = context 
        .CmsContents 
        .SelectMany(cnt => cnt.CmsCategories, 
           (cnt, categoy) => new { cnt, categoy }) 
        .Where(a => a.categoy.CategoryId == myCurrentCategoryId 
          && a.cnt.ContentId == myCurrentContentId) 
        .Select(a => a.cnt) 
        .Single(); 

從本質上講,「嵌套」 from子句導致SelectMany呼叫具有透明標識符(一個匿名型實例保持「父」 cnt和「子」 categoy)。 Where篩選器應用於匿名類型實例,然後我們再執行Select投影來獲取「父」。 Single電話當然總是在查詢表達式之外,所以它應該是顯而易見的。

欲瞭解更多信息,我建議閱讀Jon Skeet的文章How query expressions work