2013-02-07 60 views
0

序列包含一個以上的元件在 System.Linq.Enumerable.SingleOrDefault [TSource](IEnumerable`1源)在 System.Web.Http.OData.Builder .ODataConventionModelBuilder.RemoveBaseTypeProperties(EntityTypeConfiguration derivedEntity,EntityTypeConfiguration baseEntity) 在System.Web.Http.OData.Builder.ODataConventionModelBuilder.DiscoverInheritanceRelationships()...OData的「序列包含一個以上的元素」錯誤

這裏是我的綁定代碼:

var modelBuilder = new ODataConventionModelBuilder(); 
modelBuilder.EntitySet<PeopleDto>("People"); 

這裏是我的控制器代碼:

[Queryable] 
public IEnumerable<PeopleDto> Get(
     [FromUri] Credentials credentials, 
     ODataQueryOptions<PeopleDto> options, 
     int departmentId, 
     DetailLevel detail = DetailLevel.Low) 
{ 
    var count = _repository.Filter(x => x.DepartmentId == departmentId && x.Active); 
    options.ApplyTo(count); 
    int total = count.Count(); 

    switch (detail) 
    { 
     case DetailLevel.Low: 
      return new Paginable<PeopleDto>(GetMyPeopleLo(departmentId, options), total); 
     // [...] 
    } 
} 

Paginable<T>實現IEnumerable<T>。而GetMyPeopleLo()(不是真實名稱)方法將這些選項應用於其他查詢。 (我不再需要額外的查詢了,因爲我已經移動了分頁代碼的位置,但是我還沒有重構那個部分)。

這是oData的預發佈版本存在問題的情況之一嗎?

更新:如果我註釋掉Queryable屬性,它似乎工作,但是當選項被應用到count查詢不實際應用,我在查詢字符串指定任何過濾器。

+0

這聽起來像是與您的DTO相關的問題。 – SLaks

+0

@SLaks DTO是一個非常苗條的類,其成員都是簡單類型,整數,布爾和字符串。 – devlord

+0

如果我註釋掉'Queryable'屬性,它似乎可以工作,但是在查詢字符串中指定的任何過濾器實際上並不適用於將選項應用於'count'查詢時。 – devlord

回答

2

有兩件事情在這裏跳出:

  • 你不應該使用[可查詢]和ODataQueryOptions。他們用於做同樣的事情。 在這種情況下,ODataQueryOptions似乎更合適,因此您應該刪除[Queryable]。
  • 您沒有使用查詢結果。取而代之的是

    var count = _repository.Filter(x => x.DepartmentId == departmentId && x.Active); 
    options.ApplyTo(count); 
    int total = count.Count(); 
    

    你應該寫這樣的:

    var count = _repository.Filter(x => x.DepartmentId == departmentId && x.Active); 
    var queryResults = options.ApplyTo(count) as IQueryable<PeopleDto>; 
    int total = queryResults.Count(); 
    

    這樣,你總將考慮到的OData查詢選項。

  • 考慮使用PageResult<T>而不是Paginable,因爲OData格式化程序會計數並將其正確插入到OData Feed中。

+0

呃!謝謝@Youssef! – devlord

+0

夥計,它完全有效!我提名優素福爲MVP! – devlord

+0

在我的版本中,它仍然是'ODataResult '。我有一個關於格式化下一頁結果的URI的問題。有這方面的文件嗎? – devlord

-1

我得到這個錯誤,因爲我打電話給.Single()有多個元素的結果。

在工具提示中的方法,描述表示:

返回序列的唯一元素,並且如果 該序列包含恰好一個要素是不拋出異常。

(如果你想找到第一多個元素,調用.First()代替.Single()可能是你在找什麼。)

+0

我不認爲這是OP的(或我的)錯誤的原因。這是專門用微軟編寫的代碼。 –

1

我在以下兩種場景中看到了這個錯誤。

  1. 遮蔽實體成員 - 從實體派生的類中的成員,這些實體會影子而不是覆蓋(請參閱此discussion of the difference)。交換覆蓋解決了這裏的問題。請注意,我能夠通過在Visual Studio生成的警告中搜索來找到這些內容。
  2. 實體中的屬性部分類型BitmapImage - 將屬性的類型更改爲BitmapSource(BitmapImage的直接繼承父項)是此處的修復程序。
+0

p1幫助了我。謝謝! –

相關問題