[.NET]將IList中,如果元素是Array的話,就只取第1個回傳

如何將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 了,如下,

image

 

那前面原本預期接 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:從零開始的軟體開發生活

請大家繼續支持 ^_^