2013-08-29 90 views
0

我想查詢一個數據表,我在這裏根據某些數據選擇行的列表,並按日期排序行並獲取最新日期的行。這是我做過什麼Linq:按日期排序並查找第一個元素

var propertyValueId = _dbSis.Set<PropertyValue>() 
          .Where(m => m.PropertyInstanceId == id) 
          .OrderBy(z => z.TimeStamp); 
var pvalueId = propertyValueId.ElementAtOrDefault(0); 

,但我得到propertyValueId.ElementAtOrDetault(0);

LINQ to Entities does not recognize the method 'Sorama.DataModel.SIS.Configuration.PropertyValue ElementAtOrDefault[PropertyValue](System.Linq.IQueryable`1[Sorama.DataModel.SIS.Configuration.PropertyValue], Int32)' method, and this method cannot be translated into a store expression. 

如何能夠做到什麼,我只是預期的錯誤,我怎麼能解決這個錯誤嗎?

+0

'DataTable'不是'LINQ到Entities',是嗎? –

+1

你嘗試過'FirstOrDefault()'嗎? – asymptoticFault

回答

0

似乎奇怪FirstOrDefault()不起作用。

var pvalueId = propertyValueId.FirstOrDefault(); 

應該是不支持:

var pvalueId = propertyValueId.Take(1).SingleOrDefault(); 

或者,如果出於某種奇怪的原因,你的L2EF提供商不能處理FirstOrDefaultTakeSingleOrDefault,您可以蠻力它:

PropertyValue pvalueId = null; 
foreach (var pv in propertyValueId) 
{ 
    pvalueId = pv; 
    break; 
} 
1

發生此錯誤的原因是Linq to Entities不支持很多Linq to Objects方法。這是因爲Linq to Entities將您的查詢轉換爲表達式樹,然後將在SQL上執行。
支持和不支持的方法的完整列表,你可以找到here

而作爲@Gusdor提到:在表達式(其您lambda表達式被解析到)被視爲存儲過程繼而不存在未確認方法。檢查會發生什麼的簡單方法是查看LINQ方法的參數列表。

所以解決您應該使用的方法讓您的問題,像FirstOrDefault

var pvalueId = propertyValueId.FirstOrDefault(); 
+0

要添加一些細節,表達式中的無法識別的方法(您的lambda需要解決)將被視爲存儲過程,而存儲過程又不存在。檢查會發生什麼的簡單方法是查看LINQ方法的參數列表。如果期望表達你需要注意你的腳步。 – Gusdor

0

你能嘗試:

var propertyValueId = _dbSis.Set<PropertyValue() 
          .Where(m=>m.PropertyInstanceId==id) 
          .OrderBy(z=>z.TimeStamp).FirstOrDefault(); 
相關問題