24

IHistoricEntity部分クラスを使用してインターフェイスをサポートするエンティティ フレームワーク テーブルがいくつかあります。IHistoricEntityプロパティを持っていActiveTo Datetime?ます。

// Auto generated LINQ to Entities domain service:
[EnableClientAccess()]
public partial class ProductService : LinqToEntitiesDomainService<ProductDBEntities>
{
    public IQueryable<ANALYSIS_CODES> GetANALYSIS_CODES()
    {
        return this.ObjectContext.ANALYSIS_CODES;
    }
 ...
}

// My Partial class to add interface
public partial class ANALYSIS_CODES : IHistoricEntity
{}

この作業コードをメソッドにリファクタリングしようとしています:

List<ANALYSIS_CODE> filtered = (from rec in ps.GetANALYSIS_CODES() where rec.ActiveTo == null select rec).ToList()

そのようです:

private List<T> Filter<T>(IQueryable<T> queryable) where T : IHistoricEntity
{
    return (from rec in queryable where rec.ActiveTo == null select rec).ToList();
}

// called like this:
List<ANALYSIS_CODE> filtered = Filter(ps.GetANALYSIS_CODES());

これにより、次の例外が発生しますToList

タイプ「ANALYSIS_CODES」をタイプ「IHistoricEntity」にキャストできません。LINQ to Entities は、Entity Data Model プリミティブ型のキャストのみをサポートします。

しかし、どこにキャストするように依頼しましたIHistoricEntityか? 私はそれTが をサポートしなければならないと少ししか言いませんIHistoricEntityでした。

4

1 に答える 1

46

rec.ActiveToインターフェイスで定義されたプロパティを参照します。したがって、Linq はそのプロパティにアクセスする前にキャストrecする必要があります。IHistoricEntity

. _ .ToList()_List<>

更新:@hvdのコメントを確認しましたが、実際、where T: class句を追加するとLinq式が

System.Collections.Generic.List`1[MyType]
    .Where(x => (Convert(x).ActiveTo == Convert(null)))

System.Collections.Generic.List`1[MyType]
    .Where(x => (x.ActiveTo == Convert(null)))
于 2012-12-04T11:15:36.673 に答える