0

Node (ビジネス オブジェクト クラス) の IQueryable を返すリポジトリに以下の呼び出しがあり、サービス レイヤーにフィルター関数があり、IQueryable 呼び出しに追加され、リポジトリ関数 GetNodes を ID でフィルター処理します。FilterById をリストとして返すと (実行されるため)、エラーが発生します -- The member 'bo.Node.Id' has no supported translation to SQL. --

linq で生成されていないクラスを IQueryable として返すときに、このエラーを回避する方法はありますか?

public IQueryable<bo.Node> GetNodes()
{
       return (from item in Db.Nodes select new bo.Node(item.id, 
              item.created, item.lastupdated, item.name, 
              item.parentid, item.siteid, item.userid));
}

私のサービス層で

private IQueryable<bo.Node> FilterById(IQueryable<bo.Node> source, Guid id)
{
       return source.Where(i => i.Id.Equals(id))
}
4

1 に答える 1

2

Node コンストラクターを使用しないで、代わりにプロパティの初期化を使用します。

return (
   from item in Db.Nodes select new bo.Node{
      item.id, item.created, item.lastupdated, item.name, 
      item.parentid, item.siteid, item.userid
   });

コンストラクターを使用することで、他のプロパティと一致するプロパティの式に情報を与えないことがわかります。結果のインスタンスは、コンストラクター内のロジックに基づいているため、インスタンスを返すときにコンストラクターを呼び出す以外に、linq がそれらについて行うことができる有効な仮定はありません。

于 2009-11-23T16:23:20.030 に答える