如何將IList中,如果元素是Array的話,就只取第1個回傳
話說我們在使用HQL時,寫了類似的Code,如下( Party 跟 PersonAccount 有關連),
select distinct c from PersonAccount c where 1=1 order by c.Party.Name
而該程式在 SQLite 上執行並不會有問題,但是將它切到了SQL Server就掛了,因為,錯誤訊息如下,
----> System.Data.SqlClient.SqlException : 如果已指定 SELECT DISTINCT,則 ORDER BY 項目必須顯示於選取清單中。
那怎麼辦呢? 只好將HQL改成如下,
select distinct c, c.Party.Name from PersonAccount c where 1=1 order by c.Party.Name
但是這樣資料轉出去就不是 PersonAccount 了,如下,
那前面原本預期接 List<PersonAccount> 不就也要一併都調整?
但前面的程式跟本就不需要那多出來的 Party.Name。
所以我們可以寫一個Extension Methods來將需要的取出來(前提 c.Party.Name 一定是加在最後面),如下,
public static class IListExtension
{
public static IList ProjectTopOne(this IList values)
{
var result = values.Cast<object>()
.Select(el => el.GetType().IsArray ? ((object[])el)[0] : el).ToList();
return result;
}
}
PS.針對IList使用Linq的話,可使用 Cast
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^