1

次のようなクエリを実行しようとしています:

  List<UserAssitanceView> AllAssitance = objFirstIdeaAssistanceRepository.GetAll().Select(i => new UserAssitanceView()
    {
        assitanceId = i.Assistance.Id.ToString(),
        assitanceInternalTell = i.Assistance.AssistanceTell,
        assitanceName = i.Assistance.AssistanceName,
        experteName = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Name,
        expertFamily = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Family,
        ExperteMobile = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Mobile
    }).ToList();

public class UserAssitanceView
    {
        public string assitanceId { set; get; }
        public string assitanceName { set; get; }
        public string experteName { set; get; }
        public string expertFamily { set; get; }
        public string assitanceInternalTell { set; get; }
        public string ExperteMobile { set; get; }


    }

FirstIdeaAssistance クラス:

namespace DomainClass
{
    using System;
    using System.Collections.Generic;

    public partial class FirstIdeaAssistance
    {
        public int Id { get; set; }
        public string Date { get; set; }
        public long FirstIdeaId { get; set; }
        public int AssistanceId { get; set; }

        public virtual FirstIdea FirstIdea { get; set; }
        public virtual Assistance Assistance { get; set; }
    }
}

私のクエリでは、呼び出された別のリポジトリメソッドを呼び出しobjAssistanceRepository.ReturnExpertOfAssitance、関数は次のようになります:

public class AssistanceRepository : GenericRepository<InModelContainer, Assistance>
{
    public User ReturnExpertOfAssitance(int assitanceId)
    {
        return
            FindBy(i => i.Id == assitanceId && i.AssistanceJurors.Any(j => j.User.Permission == "Assistance"))
                .First().AssistanceJurors.Select(i => i.User).First();
    }
}

実行後、次のエラーが発生しました。

LINQ to Entities does not recognize the method 'DomainClass.User ReturnExpertOfAssitance(Int32)' method, and this method cannot be translated into a store expression.

コードからこれらの 3 行を削除すると、正常に動作します。

experteName = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Name,
            expertFamily = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Family,
            ExperteMobile = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Mobile

以前はこのようにしましたが、うまくいきましたが、なぜこのエラーが発生するのかわかりません。

すべてのアイデアが評価されます

よろしくお願いします

4

1 に答える 1

1

Linq はそのメソッドを認識しません。式ツリーと一部の SQL 関数拡張からのみ変換できます。

最初にクエリを実行する必要があります。

List<UserAssitanceView> AllAssitance = objFirstIdeaAssistanceRepository.GetAll().Select(i => new UserAssitanceView()
    {
        assitanceId = i.Assistance.Id.ToString(),
        assitanceInternalTell = i.Assistance.AssistanceTell,
        assitanceName = i.Assistance.AssistanceName,
    })
   .ToList();

そして、後でいくつかのプロパティを設定します。

foreach (var item in AllAssitance)
{
    item.experteName = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Name;
    item.expertFamily = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Family;
    item.ExperteMobile = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Mobile;
}

または、クエリ全体に対して最初に実行することもできます。

List<UserAssitanceView> AllAssitance = 
     objFirstIdeaAssistanceRepository.GetAll().AsEnumerable().Select
                                                  ^^^^
                                                add this

PS

AsEnumerableタイプを からIQueryable<T>に変更し、IEnumerable<T>反復された場合にのみ異なる実行を引き起こします。これにより、この呼び出しの後の実行ではデータベースが実行されず、単に列挙可能なものから反復されることが保証されます。したがって、CLR メソッドのような非 linq 式を使用しても安全です。

このコードだけでは、クエリは実行されません。

var result = objFirstIdeaAssistanceRepository.GetAll().AsEnumerable();

ただし、その後にメソッドを追加Selectすると、クエリが実行されます。

var result = objFirstIdeaAssistanceRepository.GetAll().AsEnumerable().Select(/* */);
于 2014-08-26T09:09:44.227 に答える