2012-12-04 2 views
23

私はサポートしているエンティティフレームワークテーブルの数は、それらのパリティクラスを使用してIHistoricEntityです。 IHistoricEntityActiveToDatetime?です。ここでキャストはどこですか? LINQ to Entitiesは、エンティティデータモデルのプリミティブタイプをキャストすることのみをサポートします

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にこの例外を与える:

を、私はこの方法には、この作業コードをリファクタリングしようとしています

// 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 
{} 

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

しかし、どこでIHistoricEntityにキャストするように頼んだのですか?私は大いに言われたTIHistoricEntityをサポートする必要があります。

+0

にLINQの式を変更し、あなたが変数でクエリを保存しようとしたことがあり、およびそれをToListingする前にデバッガの式のプロパティを調べる?それはキャストがどこにあるかを示すはずです。 – wizzardmr42

+0

そこには何も役立つものはありません。結果を拡大しようとすると例外が発生します。 – weston

+0

明示的に.expressionプロパティにアクセスしようとしましたか?デバッガでは常に表示されるとは限りませんが、手動で入力することができます。また、try.ToString()をデバッガで試してみてください。これは手掛かりを与えるかもしれません(LinqからSQLへの作業、まだエンティティで試したとは思わない) – wizzardmr42

答えて

44

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

.ToList()で例外が発生しないようにしてください.Lineqクエリは、コレクションがList<>に変換されるときにレコードが必要な場合にのみ評価され、実行されます。

更新:私は@のHVDのコメントを確認し、そして実際に、where T: class句を追加すること

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))) 
+23

"Linqは' IHistoricEntity'を呼び出してからそのプロパティにアクセスできます。 - ほとんど、しかしそれほどではありません。その要件は、汎用引数に 'class'制約を含めることによって回避されます。型があらかじめ参照型であるとわかっている場合、 'IHistoricEntity'への変換はノーオペレーションであり、含まれません。 (キャストはそうでなければ、ボクシング操作である可能性があります。なぜなら、 'T'は構造体である可能性があるからです。) – hvd

+2

@hvdあなたのおかげで、' T:class、IHistoricEntity'がトリックをしました。そしてそれは起動するのに理にかなっています! – weston

+0

うわー!私は数日間のソリューションを創設していました!そしてどこでT:クラスがそれを修正しますか?ありがとうございました!!! 1 –