3

解決するのに数週間かかった問題があり、解決できませんでした。

2つのメソッドがあるクラスがあります。以下は、データベースから最新の日付を取得することになっています。その日付は、顧客が「何か」に対して行った最新の支払いを表します。

public DateTime getLatestPaymentDate(int? idCustomer)
{
    DateTime lastDate;

    lastDate = (from fp in ge.Payments
                from cst in ge.Customers
                from brs in ge.Records.AsEnumerable()
                where (cst.idCustomer == brs.idCustomer && brs.idHardBox == fp.idHardbox
                       && cst.idCustomer == idCustomer)
                select fp.datePayment).AsEnumerable().Max();

    return lastDate;
}//getLatestPaymentDate

そして、ここにもう1つのメソッドがあります。これは、前のメソッドを呼び出してLinqクエリを完了し、CrystalReportに渡すことになっています。

//Linq query to retrieve all those customers'data who have not paid their safebox(es) annuity in the last year.
public List<ReportObject> GetPendingPayers()
{
    List<ReportObject> defaulterCustomers;

      defaulterCustomers = (from c in ge.Customer
                            from br in ge.Records
                            from p in ge.Payments

                            where (c.idCustomer == br.idCustomer
                                   && br.idHardBox == p.idHardBox)

                            select new ReportObject
                            {
                                CustomerId = c.idCustomer,
                                CustomerName = c.nameCustomer,
                                HardBoxDateRecord = br.idHardRecord,
                                PaymentDate = getLatestPaymentDate(c.idCustomer),
                            }).Distinct().ToList();
}//GetPendingPayers

ここではコンパイルエラーはスローされませんが、アプリケーションを実行し、2番目のメソッドがフィールドの最初のメソッドを呼び出そうとするとPaymentDate、ヘッダーに記載されているエラーが発生します。

Linq to Entities does not recognize the method System.DateTime.. and cannot translate this into a store expression

この厄介なエラーから私を遠ざける有用な入力を持っている人はいますか?どんな助けでもありがたいです!

どうもありがとう !

4

1 に答える 1

1

これらの他の質問を見てください:

LINQ to Entities がメソッドを認識しない

LINQ to Entities がメソッド 'System.DateTime Parse(System.String)' メソッドを認識しない

基本的に、C# 側で値を使用して SQL に変換することはできません。最初の質問は、より完全な説明を提供します。2 つ目は、問題に対する簡単な解決策を提供します。

編集 :

簡単に言えば、EF は SQL サーバーにgetLatestPaymentDateメソッドを実行するように要求していますが、それについての手がかりはありません。プログラム側で実行する必要があります。

最初にクエリを実行し、結果をリストに入れてから、Selectメモリ内リストで実行します。

 List<ReportObject> defaulterCustomers;

  var queryResult = (from c in ge.Customer
                        from br in ge.Records
                        from p in ge.Payments

                        where (c.idCustomer == br.idCustomer
                               && br.idHardBox == p.idHardBox)).Distinct().ToList();

defaulterCustomers = from r in queryResult
                     select new ReportObject
                        {
                            CustomerId = r.idCustomer,
                            CustomerName = r.nameCustomer,
                            HardBoxDateRecord = r.idHardRecord,
                            PaymentDate = getLatestPaymentDate(r.idCustomer),
                        }).Distinct().ToList();

もちろん、私はあなたのコードにアクセスできないので、試してみて、うまくいくかどうか教えてください! メモリ内リストになります

于 2013-03-08T16:04:33.723 に答える