2016-10-24 2 views
1

私のプロジェクトの要件であるLINQラムダ式を使用してSQL Server 2014からデータをフェッチしようとしています。しかし、私がLINQに慣れていないので、私はここでコードに何か間違っていると思うし、エラーが出ます。SQL Server 2014からLINQラムダ式を使用して複数の行を返す方法は?

エラーが発生していない行は1つしか取得できませんが、複数の行をフェッチする条件を設定するとエラーが発生します。ここで

は私のコードである - これは、リポジトリのクラスである:私は

後に置けば、コードを記述しながら、このエラーが当たっている

Argument 1: cannot convert from 'System.Linq.IQueryable' to 'DAL.Service.Entity.Dettagli' Core.Service

しかし:

​​

私はこのエラーを取得しています

.Where(x => x.IDDoc == id).FirstOrDefault(); 

エラーが発生します。

FirstOrDefault()メソッドを使用できないため、複数の行をフェッチする必要があるため、これを解決するにはどうすればよいのか教えてください。ありがとう。

+0

あなたがautomapperを使用していList<dbCtx.Dettaglis>:あなたはAutomapperを使用して、異なるモデルへの倍数のエンティティをマッピングしたい場合は、私はあなたがProjectTo<T>拡張メソッドを使用することをお勧め? – octavioccl

+0

はい私はそれを使用しています。 – barsan

+0

関連性があるので、私はあなたの質問にそのタグを含めました – octavioccl

答えて

2

Where拡張メソッドは、IQueryable<T>を返します。つまり、複数の要素です。

public IEnumerable<DettagliModel> ConvertTo(IQueryable<Dettagli> entities) 
{ 

    return entities.ProjectTo<DettagliModel>().ToList(); 
} 

public IEnumerable<DettagliModel> GetByIdDocs(int id) 
{ 
    using (var dbCtx = new USDevEntities()) 
    { 
     return ConvertTo(dbCtx.Dettaglis.Where(x => x.IDDoc == id)); 

    } 

} 
+0

答えをありがとう。あなたのコードを試しましたが、ProjectTo ()行に "ProjectToの定義が含まれていません"というエラーが表示されています。私はこれをどのように実装するか教えてください。 – barsan

+0

名前空間を追加する必要があります。私はその名前を覚えていない。 AutoMapperを使用して、もう一度 – octavioccl

+0

を待ちます。QueryableExtensions; ' – octavioccl

0

まず、これはnullになることはありません:何かがIEnumerable<T>とき

var dettagli = dbCtx.Dettaglis.Where(x => x.IDDoc == id); 

また、Enumerable.Empty<T>()を使用し、nullを返しません。


は今、あなたの方法は、単一の Dettagliから作成する ConvertTo、単一 DettagliModelを返すように見えます。

あなたは今ちょうどあなた自身のタイプにデータベース・エンティティを投影する .Selectを使用することができ、そのうちの方法で IEnumerable<DettagliModel>

に戻り値の型を変更する必要があるかもしれません

return 
    dettagli.Select(d => ConvertTo(d)); 
    //or just dettagli.Select(ConvertTo); if you like. 

これは次のようになります遅延のあるコレクションなので、最後に.ToList()を使用し、その後に.AsReadOnly()が続く、または.ToArray() YMMVを使用して、これをおそらく非遅延型のものに変換します。

0
.Where(x => x.IDDoc == id).ToList(); 

戻り

+0

ありがとうジュリアン.. – BRV

関連する問題