2016-10-26 13 views
0

次のエラーが表示されます。照会エンティティのリストを返すと、「式を変換できませんでした...」というカスタムクラスに変換されました。式を変換できませんでした

私はこの方法でリンクを使用するのが非常に新しいです、過去に私はSQLでストアドプロシージャを使用し、メソッドとしてインポートするだけですが、私はこれらを変換しようとしています。リストを返し

私の方法は次のとおりです。

public static List<EnquiryData> GetAllEnquiries() 
{ 
    var GridData = from a in Global.AcepakSalesPortal.Enquiries 
        join Cust in Global.AcepakSalesPortal.Customers 
         on a.CustomerID equals Cust.CustomerID into CustGroup 
        from b in CustGroup.DefaultIfEmpty() 
        join Pros in Global.AcepakSalesPortal.Prospects 
         on a.ProspectID equals Pros.ProspectID into ProsGroup 
        from c in ProsGroup.DefaultIfEmpty() 
        join Users in Global.AcepakSalesPortal.Users 
         on a.ResponsiblePartyID equals Users.UserID into UserGroup 
        from d in UserGroup.DefaultIfEmpty() 
        join Qt in Global.AcepakSalesPortal.Quotes 
         on a.QuoteID equals Qt.QuoteID into QuoteGroup 
        from e in QuoteGroup.DefaultIfEmpty() 
        join Usr in Global.AcepakSalesPortal.Users 
         on e.CreatedBy equals Usr.UserID into UsrGroup 
        from f in UsrGroup.DefaultIfEmpty() 
        join EnqCat in Global.AcepakSalesPortal.EnquiryCategories 
         on a.EnquiryCategoriesID equals EnqCat.EnquiryCatID into CatGroup 
        from g in CatGroup.DefaultIfEmpty() 
        join Clsd in Global.AcepakSalesPortal.Users 
         on a.ClosedBy equals Clsd.UserID into ClsdGroup 
        from h in ClsdGroup.DefaultIfEmpty() 
        orderby a.Created descending 
        select new EnquiryData 
        { 
         EnquiryID = a.EnquiryID, 
         ResponsiblePartyID = a.ResponsiblePartyID, 
         EnquiryNo = "ENQ" + a.EnquiryID.ToString().PadLeft(7, '0'), 
         EType = a.CustomerID.HasValue ? "C" : "P", 
         EnqCat = g.Code + " - " + g.Category, 
         ContactPerson = a.ProspectID.HasValue ? c.ContactPerson : "NOT INTEGRATED YET", 
         ContactNumber = a.ProspectID.HasValue ? c.ContactNum : "NOT INTEGRATED YET", 
         ContactEmail = a.ProspectID.HasValue ? c.ContactEmail : "NOT INTEGRATED YET", 
         Company = a.CustomerID.HasValue ? b.Name : c.CompanyName, 
         Description = a.Description, 
         AssignedTo = d.Name, 
         AddressBy = a.AddressBy, 
         EnquiryDate = a.Created, 
         EStatus = a.Closed.HasValue ? "Closed" : a.QuoteID.HasValue ? "Quoted" : "Open", 
         QuotedOn = a.QuoteID.HasValue ? e.Created.ToShortDateString() : "N/A", 
         QuotedBy = a.QuoteID.HasValue ? f.Name : "N/A", 
         QuoteNum = a.QuoteID.HasValue ? e.QuoteID.ToString().PadLeft(7, '0') : "N/A", 
         ClosedOn = a.Closed.HasValue ? a.Closed.Value.ToShortDateString() : "N/A", 
         ClosedBy = a.Closed.HasValue ? h.Name : "N/A", 
         Reason = a.Closed.HasValue ? a.ClosedReason : "N/A" 
        }; 

    return GridData.ToList(); 
} 

とカスタムクラスがある:

public class EnquiryData 
{ 
    public int EnquiryID { get; set; } 
    public int ResponsiblePartyID { get; set; } 
    public string EnquiryNo { get; set; } 
    public string EType { get; set; } 
    public string EnqCat { get; set; } 
    public string ContactPerson { get; set; } 
    public string ContactNumber { get; set; } 
    public string ContactEmail { get; set; } 
    public string Company { get; set; } 
    public string Description { get; set; } 
    public string AssignedTo { get; set; } 
    public DateTime AddressBy { get; set; } 
    public DateTime EnquiryDate { get; set; } 
    public string EStatus { get; set; } 
    public string QuotedOn { get; set; } 
    public string QuotedBy { get; set; } 
    public string QuoteNum { get; set; } 
    public string ClosedOn { get; set; } 
    public string ClosedBy { get; set; } 
    public string Reason { get; set; } 
} 

私の質問は2倍 1であるで一緒にテーブルを結合するためのより良い方法はありますLinqは私が上でやっているよりも? 2.エラーを引き起こす原因は何か、私はそれを理解していませんが、これにアプローチする方法もわかりません。

編集:これは、間違いなく、上記の質問の重複ではありません。 2つの間の唯一の類似点は、短い文字列の使用ですが、私が受け取るエラーメッセージは他の質問と全く異なります。

+0

あなたは問題が何であるかを伝えることができますか? – Sampath

+0

select aを使用すると、例外なくレコードを正常に取得できます。だから私はそれが幸せではないことを推測しています。 – ThatChris

+0

context.Database.Log =(sw)=> Debug.WriteLine(sw);クエリの宣言の前にこの行を含めることができます。翻訳されたクエリと実行のためにVSの出力ウィンドウにチェックインしてください。 contextがあなたのDbContextの名前である場合 – Raghu

答えて

1

をあなたは、以下のようにすべての列を取得し、行うことができますSQL.Henceで知られていないc#方法の多くを使用しています必要に応じてメモリ上のカスタムマッピング。

その後
var GridData = (from a in Global.AcepakSalesPortal.Enquiries 
        join Cust in Global.AcepakSalesPortal.Customers 
         on a.CustomerID equals Cust.CustomerID into CustGroup 
        from b in CustGroup.DefaultIfEmpty() 
        join Pros in Global.AcepakSalesPortal.Prospects 
         on a.ProspectID equals Pros.ProspectID into ProsGroup 
        from c in ProsGroup.DefaultIfEmpty() 
        join Users in Global.AcepakSalesPortal.Users 
         on a.ResponsiblePartyID equals Users.UserID into UserGroup 
        from d in UserGroup.DefaultIfEmpty() 
        join Qt in Global.AcepakSalesPortal.Quotes 
         on a.QuoteID equals Qt.QuoteID into QuoteGroup 
        from e in QuoteGroup.DefaultIfEmpty() 
        join Usr in Global.AcepakSalesPortal.Users 
         on e.CreatedBy equals Usr.UserID into UsrGroup 
        from f in UsrGroup.DefaultIfEmpty() 
        join EnqCat in Global.AcepakSalesPortal.EnquiryCategories 
         on a.EnquiryCategoriesID equals EnqCat.EnquiryCatID into CatGroup 
        from g in CatGroup.DefaultIfEmpty() 
        join Clsd in Global.AcepakSalesPortal.Users 
         on a.ClosedBy equals Clsd.UserID into ClsdGroup 
        from h in ClsdGroup.DefaultIfEmpty() 
        orderby a.Created descending 
        select a).ToList() 

ここにあなたのカスタムクラスのマッピングを行います。あなたはこのように `A`選択しない代わりにカスタムクラスが私たちをmapper.tellとき

var list= GridData.Select(a=>new EnquiryData{EnquiryID = a.EnquiryID,.... }) 
0

1.これらのクエリが実行されると、linqコンパイラはこのlinqクエリをSQLクエリに変換する必要があります。IQuerableのインフェイスを実装するメソッドのほとんどは変換可能です。 ToString()やToShortDateString()のようなC#メソッドはLinqコンパイラでは変換できませんでした。あなたは '式を翻訳できませんでした。'というメッセージが表示されます。

-1

あなたは試みることができる:

var GridData = from a in Global.AcepakSalesPortal.Enquiries 
        join Cust in Global.AcepakSalesPortal.Customers on a.CustomerID equals Cust.CustomerID 
        join Pros in Global.AcepakSalesPortal.Prospects on a.ProspectID equals Pros.ProspectID 
        join Users in Global.AcepakSalesPortal.Users on a.ResponsiblePartyID equals Users.UserID 

など。

+0

左ではなく内部の結合にならないでしょうか?少なくともそれは私の理解でしたか? – ThatChris

関連する問題