2017-03-06 6 views
2

LINQ以下にはいくつかの方法があります。Convert.ToInt32しかし、それは動作しません。インターネットを参照すると、変換の代わりにint.Parseが使用されます。依然としてエラーが発生します。私にこれを行う方向を示してください。 Convert.ToInt32を使用する場合LINQでIntに変換

コードLINQは、エラーをスロー上方ためのエンティティフレームワークを使用している:

クエリ以下で

todyのデータ型が更新DateTime

var ds = (from a in dbSetInvHeader 
      join b in dbSetCustomer on a.BusinessEntityID equals b.Id 
      join c in dbSetFinancialInfo on b.Id equals c.Id 
      where (a.TotalAmount - a.AppliedAmount - a.ApplyToInvoiceCreditAmount) > 0 
         && DbFunctions.AddDays(a.InvoiceDate, Convert.ToInt32(c.CreditPeriod)) >= tody 
      select new OverDueInvoices 
         { 
          CustomerName = b.Name, 
          InvoiceNo = a.InvoiceNo, 
          InvoiceAmount = a.TotalAmount - a.ApplyToInvoiceCreditAmount, 
          DueAmount = (a.TotalAmount - a.AppliedAmount - a.ApplyToInvoiceCreditAmount), 
          CreditAmount = a.ApplyToInvoiceCreditAmount, 
          NoOfDays = Convert.ToInt32(DbFunctions.DiffDays(tody, a.InvoiceDate)) 
         }).ToList(); 

あります

"LINQ to Entitiesは、メソッド 'Int32 ToInt32(System.Decimal)'を認識せず、このメソッドをストア式に変換することはできません。

int.Parseを使用して:「エンティティへのLINQのメソッド 『のInt32パース(可能System.String)』メソッドを認識しない、そしてこの方法は、ストア式に変換することができない」

+0

nullを変換しようとしながら、あなたがInvalidCastExceptionを得ることができるよう(int)にキャスト避ける方が良いでしょうNullable<int>またはint?を返しますか? –

+0

[EntityFunctions](https://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions(v = vs.110).aspx)を試してください。 –

+0

"UPDATE 1"に詳細を追加しました – weeraa

答えて

1

SQLはConvert.ToInt32関数について知らない。 Entity Frameworkで文字列をintに変換するための回避策はないようです。あなたにできることはあなたに別の列を追加することです

public string NoOfDaysString {get; set;} 
public string NoOfDays {get { return Convert.ToInt32(NoOfDaysString); } ;} 

をNoOfDaysStringオブジェクトと、

var ds = (from a in dbSetInvHeader 
        join b in dbSetCustomer on a.BusinessEntityID equals b.Id 
        join c in dbSetFinancialInfo on b.Id equals c.Id 
        where (a.TotalAmount - a.AppliedAmount - a.ApplyToInvoiceCreditAmount) > 0 
        && DbFunctions.AddDays(a.InvoiceDate, Convert.ToInt32(c.CreditPeriod)) >= tody 
        select new OverDueInvoices 
        { 
         CustomerName = b.Name, 
         InvoiceNo = a.InvoiceNo, 
         InvoiceAmount = a.TotalAmount - a.ApplyToInvoiceCreditAmount, 
         DueAmount = (a.TotalAmount - a.AppliedAmount - a.ApplyToInvoiceCreditAmount), 
         CreditAmount = a.ApplyToInvoiceCreditAmount, 
         NoOfDaysString = Convert.ToInt32(DbFunctions.DiffDays(tody, a.InvoiceDate)) 

        }).ToList(); 

としてクエリを書き直すこれは私がどこ文の考えることができる唯一の回避策です。オブジェクトがメモリ内

var ds = (from a in dbSetInvHeader 
       join b in dbSetCustomer on a.BusinessEntityID equals b.Id 
       join c in dbSetFinancialInfo on b.Id equals c.Id 
       where (a.TotalAmount - a.AppliedAmount - a.ApplyToInvoiceCreditAmount) > 0 
       select new OverDueInvoices 
       { 
        CustomerName = b.Name, 
        InvoiceNo = a.InvoiceNo, 
        InvoiceAmount = a.TotalAmount - a.ApplyToInvoiceCreditAmount, 
        DueAmount = (a.TotalAmount - a.AppliedAmount - a.ApplyToInvoiceCreditAmount), 
        CreditAmount = a.ApplyToInvoiceCreditAmount, 
        NoOfDaysString = Convert.ToInt32(DbFunctions.DiffDays(tody, a.InvoiceDate)) 
        CreditPeriod = c.CreditPeriod 
       })ToList().Where(t=>Convert.ToInt32(t.CreditPeriod) >= NoOfDays).ToList(); 
+0

ありがとうございます。実際にはこれはあなたが言及したように動作します。しかし、WHERE条件には他のキャストパートがあります。私は "intCreditDays"という新しいプロパティを含む同じことをやろうとします。しかし、 "指定された型メンバー 'intCreditDays'は、LINQ to Entitiesではサポートされていません。イニシャライザ、エンティティメンバー、エンティティナビゲーションプロパティのみサポートされています。エラーが発生しました。 – weeraa

+0

あなたは@Mikhail Neofitovが納得したようにint(int?)c.CreditPeriodとしてキャストしようとしましたか? –

+0

うわあ...助けて...ありがとう... – weeraa

0

DbFunctions.DiffDays(tody, a.InvoiceDate)された後、あなたのオブジェクトにCreditPeriodを追加し、どこを行う最初のものがあるNullable<int>を返すので、代わりにConvert.ToInt32次の

DbFunctions.DiffDays(tody, a.InvoiceDate).GetValueOrDefault(); 
DbFunctions.DiffDays(tody, a.InvoiceDate) ?? someIntegerDefaultValue; 
DbFunctions.DiffDays(tody, a.InvoiceDate).Value; 

のいずれかを試してくださいています結果がnullであり、この場合は0になりたいと知っている場合は、 2つ目は、異なるデフォルト値が必要な場合や、より複雑な置換を計算する場合、3つ目は結果がnullでないことがわかっている場合で、nullの場合は例外を取得することができます。

1

@LiviuBoboiaが指摘したように、SQLはConvert.ToInt32int.Parseの両方のメソッドについて何も知らず、EFはこのメソッドの呼び出しをSQLに正しく変換できませんでした。このキャストは、SQL関数CONVERTとしてSQLに変換され、これは良い動作するはず

NoOfDaysString = (int)DbFunctions.DiffDays(tody, a.InvoiceDate) 

:この代わりに、あなたは、単純なキャストを行うことができます。

が、DbFunctions.DiffDaysは、エラーがスローされますされている何int

+0

'int?'は 'Nullable 'の構文砂糖です。 – grek40

+0

@ grek40うん、わかっている。私は、実際の名前ではなく、この構文的な砂糖のバージョンにもっと精通していると思います。 –