2012-01-17 12 views
6

私は、次のEntity Framework - x型の定数を作成できません。このコンテキストでは、プリミティブ型のみがサポートされています。

エンジニアのモデルがあります:

public class engineers 
{ 
    public Guid? Guid { get; set; } 
    public string Name { get; set; } 
} 

私は正しい内容とエンジニアのリストを埋める:

List<engineers> listeng = new List<engineers>(); 
listeng.Add(new engineers { Name = profile.FirstName + " " + profile.LastName, Guid = GuidEngineer }); 

これまでのところは良いです。

どのように私は以下のENGエントリにエンジニア名を引くことができます私の質問:

Unable to create a constant value of type 'Helpdesk2.ViewModel.engineers'. Only primitive types ('such as Int32, String, and Guid') are supported in this context."} 
:私も、私は取得していますエラーがある

var tickets = from o in new HelpdeskEntities().Tickets.Where(t => t.TicketState.State == "Open") 
        select new AjaxTickets 
        { 
         TicketID = o.TicketID, 
         TicketSubject = o.TicketSubject, 
         ClientCompanyName = o.ClientCompany.ClientCompanyName, 
         DateOpened = o.DateOpened, 
         **eng** = list.Where(x => x.Guid == o.EngineerID).Select(x => x.Name }).FirstOrDefault() 
        }; 

を試してみた

var tickets = from o in new HelpdeskEntities().Tickets.Where(t => t.TicketState.State == "Open") 
        select new AjaxTickets 
        { 
         TicketID = o.TicketID, 
         TicketSubject = o.TicketSubject, 
         ClientCompanyName = o.ClientCompany.ClientCompanyName, 
         DateOpened = o.DateOpened, 
         **eng** = list.Where(x => x.Guid == o.EngineerID).Select(x => new engineers {Guid = x.Guid, Name=x.Name }).FirstOrDefault().Name 

        }; 

は、

エンジニアの名前を選択するだけでは分かりませんが、わからないことはありますか。事前

+2

Linqからエンティティへのクエリで 'list'を使用することはできません。データベースに存在するデータのみ使用できます。 linq-to-objectsとlinq-to-entitiesは、EFがSQLへの変換方法を知らないため、任意に組み合わせることはできません。 @ harriyottの回避策を使用し、データベースからチケットをロードした後に 'Name'を設定してください。 –

答えて

3

にあなたが最初のものを簡素化することができるはずです

ありがとう:

list.FirstOrDefault(x => x.Guid == o.EngineerID).Name 

は、Entity Frameworkは、おそらくあなたがデータベース呼び出しを実行するときにすることを実行させません、と述べました。チケットからエンジニアまで外部キーを作成できる場合は、クライアントの会社名と同じ方法で外部キーを選択することができます。そうでない場合は、次の2つでそれを行う必要があります行く:まず、エンジニアのnameプロパティを移入せずに選択を実行し、その後、のようなものでそれらを記入:

あなたが必要と明らかに
tickets.ForEach(ticket => ticket.EngineerName = engineers.First(eng => eng.Guid == ticket.EngineerID).Name) 

EngineerIDプロパティを追加し、最初のステップでそれを選択します。

+0

名前の後ろに記入することの回避策は、名前をうまく埋めていません。 – user1153881

+0

実際のコードとデータベースを実行しなければ何が起こるのかを正確にテストするのは非常に難しいです(なぜ「何かのように」書いたのですか?)。ブレークポイントを設定し、チケットやエンジニアの内容を調べてみましたか? – harriyott

+0

OK、結果を新しい変数に送ってから、回避する必要がありました – user1153881

関連する問題