2016-04-11 10 views
0

私の最初の質問はhereです。リポジトリ・パターンと作業ユニットを使用してデータベースから戻された列の数を制限する方法を見つけようとしていました。私の質問は答えを見つけましたが、私はそれを解決していないし、私が今行っている問題が全く新しい主題であるので、そのテクニックを使って生まれた新しい問題を投稿することに決めました。リポジトリにダイナミックLinqラムダで選択

、私は次のパラメータを取りますGetメソッドがあります。

public virtual IEnumerable<TEntity> Get(
     Expression<Func<TEntity, bool>> filter = null, 
     Func<TEntity, TEntity> selector = null, 
     Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, 
     string includeProperties = "") 

を以下の私のコントローラの内部でうまく機能:

IEnumerable<Models.Authors.Author> authors = unitOfWork.AuthorRepository.Get(filter: x => x.TenantID == 1); 

しかし、私は「を選択することができません'部分の作業:

IEnumerable<Models.Authors.Author> authors = unitOfWork.AuthorRepository.Get(filter: x => x.TenantID == 1, selector: a=> new { FirstName = a.FirstName }); 

と同様に、この:

var authors = unitOfWork.AuthorRepository.Get(filter: x => x.TenantID == 1, selector: a=> new { FirstName = a.FirstName }); 

は、次の2つのエラーを与える:

Cannot implicitly convert type '<anonymous type: string FirstName>' to 'Models.Authors.Author' 

Cannot convert lambda expression to intended delegate type because some of the return types in the block are not implicitly convertible to the delegate return type 

私はこれに完全に外国人です。だから私は本当に

を更新しました。..あなたの助けをいただければ幸いですこの:

The entity or complex type 'DAL.Author' cannot be constructed in a LINQ to Entities query. 

UPDATE 2:著者のクラス //名前空間

IEnumerable<Models.Authors.Author> authors = unitOfWork.AuthorRepository.Get(filter: x => x.TenantID == 1, selector: a=> new Models.Authors.Author() { FirstName = a.FirstName }); 

この与えは

です
namespace Models.Authors 
{ 
public class Author 
{ 
    [Key] 
    public int AuthorID { get; set; } 
    public int CategoryID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string PhotoPath { get; set; } 
    public byte[] PhotoBinary { get; set; } 
    public string PhotoPathOriginal { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public Guid? PassGuid { get; set; } 
    public string Email { get; set; } 
    public string Twitter { get; set; } 
    public string Facebook { get; set; } 
    public DateTime? DateCreated { get; set; } 
    public DateTime? DateLastlogin { get; set; } 
    public int AuthorStatus { get; set; } // 0:inactive, 1:active, 2:suspended, 3:hidden etc. 
    public string AboutAuthor { get; set; } 
    public bool? RequirePublishApproval { get; set; } 
    public string ColumnName { get; set; } 
    public string ColumnImage { get; set; } 
    public bool? ChangePassAtFirstLogin { get; set; } 
    public int TenantID { get; set; } 

    public virtual AuthorCategory AuthorCategory { get; set; } 
    public virtual IQueryable<Post.Post> Posts { get; set; } 
} 
} 
+0

あなたの選択操作の戻り値の型は 'Authors.Author'であることを行っていない...あなたはあなたが選択をするときに、新しい、匿名のタイプを予測しています。あなたが何をしようとしているかによって、作者を 'var 'と宣言するだけです。 –

+0

動的LINQの使用を検討してください。または[this](http://stackoverflow.com/a/723018/861716)を見てください。これは重複した質問です。 –

+0

Gertさんありがとうございますが、私のために消化するにはあまりにも多くのことがあります。単純な作業のように思えるものは、コードを書くのが大量である場合は、リポジトリパターンを取り除く方が良いかもしれません。 –

答えて

1

あなたは、クエリ内の各レコードを返すためにリポジトリを求めている新しい匿名のオブジェクト結果:

selector: a => new { FirstName = a.FirstName } 

をしかし同時に、あなたが宣言した変数がためにタイプIEnumerable<Models.Authors.Author>

でありますそれを動作させるには、選択したモデルのModel.Authors.Authorオブジェクトを返す必要があります。

IEnumerable<Models.Authors.Author> authors = unitOfWork.AuthorRepository.Get(filter: x => x.TenantID == 1, selector: a=> new Models.Authors.Author() { FirstName = a.FirstName }); 

電子匿名オブジェクトは、しかし、あなたはあなたが原因エンティティまたは複合型」に、あなたのクエリにすでにマッピングされたコンテキストエンティティを使用することはできませんのでvar

var authors = unitOfWork.AuthorRepository.Get(filter: x => x.TenantID == 1, selector: a=> new { FirstName = a.FirstName }); 

UPDATE

として変数を宣言する必要がある 『...』できません私が見る最良の解決策は、あなたのページに必要ないくつかのプロパティを持つ別のクラスを持つことです。同様に:その後、

public class AuthorDetails { 
    public string FirstName {get; set;} 
} 

し、クエリおよびビューでこのクラスを使用します。

var authors = unitOfWork.AuthorRepository.Get(filter: x => x.TenantID == 1, selector: a=> new AuthorDetails { FirstName = a.FirstName }); 
+0

ありがとうPavelしかし、前にこれらを試してみたので私の更新された答えを見てください。あなたの2番目の提案も、私の質問で言及したのと同じエラーをもたらします。 –

+0

Authorクラスを共有していただけますか?それはちょうどプロパティを持つドメインモデルではないように見える –

+0

私はちょうど質問を更新しました..あなたの時間をありがとうpa –