2013-04-26 58 views
2

我最近發現我無法從linq查詢中調用任何方法。我想寫一個查詢,在where子句比較兩個字節數組。數據庫上的值是一個Raw(32)類型的GUID,它作爲一個字節數組返回。這是此表的記錄ID。我需要將它與另一個字節數組進行比較。第二個字節數組可以轉換爲字符串,但因爲我不能從linq內調用方法,我無法比較。Linq查詢中的表達式

我綁定了一個自定義的「比較」方法,我也寫了一個擴展方法。所有收到一個錯誤,指示「LINQ to Entities does not recognized the method」

這是我正在嘗試做的代碼。 where子句導致此錯誤: LINQ to Entities無法識別方法'Boolean SequenceEqual [Byte](System.Collections.Generic.IEnumerable 1[System.Byte], System.Collections.Generic.IEnumerable 1 [System.Byte])''方法,並且此方法無法轉換爲存儲。表達」

EPSGEntities dbContex = new EPSGEntities(); 
byte[] byteArray = ParseHex(ViewState["itemID"].ToString()); 
    var q = (from d in dbContex.EPSG_VSOREJECTS 
       where d.SDSRECID.SequenceEqual(byteArray) 
       select d).First(); 
+0

您可以先從數據庫加載,然後對本地副本進行sequenceEqual比較嗎? – Thewads 2013-04-26 15:55:43

+0

只是要清楚,你不能調用從'linq到sql'的方法,你可以只用linq到對象 – 2013-04-26 15:57:40

+0

我想避免將整個表存儲到數據集/列表中,然後查詢它。我希望從linq查詢得到一個單一的結果 – user2275571 2013-04-26 16:47:24

回答

0

我不能完全肯定這工作,但我發現在IQueryable對象集調用.AsEnumerable()讓我申請幾乎我想任何代碼:

var q = dbContex.EPSG_VSOREJECTS. 
    .AsEnumerable() 
    .Where(d => d.SDSRECID.SequenceEqual(byteArray)); 

這樣做似乎阻止EF試圖翻譯Where()條款到SQL語法,但我不知道會有什麼性能衝擊。

這也是使用方法的語法,因爲我不熟悉查詢語法。 HTH。

編輯:

正如一些人指出的那樣,你必須要小心你如何添加任何的迭代方法(AsEnumerable()ToList()等),因爲過去你那點不再是構建SQL針對您的數據存儲。一旦開始迭代,EF將執行到那時爲止建立的任何查詢,並從此開始過濾來自LINQ查詢的結果集。

在這種情況下,我不知道這是可以避免的,除非有人可以構建與存儲過程相同的查詢(EF可以代表您執行)。

+0

如果你不確定你在做什麼,這是非常危險的。會發生什麼是你迫使查詢執行,在'.AsEnumerable()'調用之前檢索everyting,然後在內存中對其進行過濾。在某些情況下,這可能是最簡單也是最好的方式來執行你想要的操作,但是在大多數情況下,將數據庫表的全部內容選入內存並不是你想要做的。 – AHM 2013-11-18 15:40:43

1

您使用的是什麼版本的EntityFramework?在EF6我可以簡單地做一個varbinary列針對SQL 2012表如下:

var q = dbContext.EPSG_VSOREJECTS.FirstOrDefault(e => e.SDSRECID == byteArray); 

byte[]類型的EPSGEntitiesSDSRECID財產?

這裏的替代方法是直接使用Sql來獲取對象。喜歡的東西:

dbContext.Database.SqlQuery<EPSG_VSOREJECT>("SELECT TOP 1 *" + 
               "FROM dbo.EPSGEntities" + 
               "WHERE SDSRECID = @byteString", 
             new SqlParameter 
             {  
             ParameterName = "byteString", 
             Value = ViewState["itemID"].ToString(), 
             }).FirstOrDefault(); 

LINQ到實體中EF是真棒大多數查詢,但我有時會下降到SQL時,我需要做的事情不支持的,複雜的,或只是快。希望這可以幫助!