2016-10-06 7 views
0

LINQクエリでこのクラス拡張を使用するにはどうすればよいですか。 私はエラーを取得する:LINQクエリの内部でこのクラス拡張を使用するにはどうすればよいですか?

Method 'System.DateTime AddBusinessDays(System.DateTime, Int32)' has no supported translation to SQL.

 var CProcess = (from m in DataContext.csrcallds 
         let scheddt = FluentDateTime.DateTimeExtensions.AddBusinessDays((DateTime)m.scheduledon, 2) 
         where m.scheduledon >= earliestDate 
         && m.scheduledon <= objdate1.DateStart 
         && m.calltype == "CHQRUN" 
         && (SqlMethods.DateDiffDay(scheddt, m.completedon) > 2) 
         group m by new { m.scheduledon.Value.Year, m.scheduledon.Value.Month } into p 
         orderby p.Key.Year ascending, p.Key.Month ascending 
         select new Date1() 
         { 
          theDate = DateTime.Parse($"{p.Key.Month} - {p.Key.Year}"), 
          theCount = p.Count(), 
          theString = $"{p.Key.Month} - {p.Key.Year}" 
         }); 

私が使用しています方法: https://stackoverflow.com/a/1379158/6157660

+0

あなたは 'AddBusinessDays'拡張メソッドのコードを表示できますか?つまり、メソッドの内容をlinqクエリに直接追加する必要があります。メソッドのコードに応じて、[LinqKit](http://www.albahari.com/nutshell/linqkit.aspx)がオプションになる可能性があります。 – Maarten

+0

@Maarten http://stackoverflow.com/a/1379158/6157660 –

+0

@GiladGreen SQLユーザー定義関数を呼び出す予定はありません。 –

答えて

2

をその名前のSQL関数が存在しないので、あなたのクエリがない場合は、適切な応答を取得しています実体化されていますが、linq to sqlはすべてのステートメントをSQLステートメントに変換しようとしますが、もちろんあなたの拡張機能は変換できません。

関数をSQL自体のインスタンスに追加したり、クエリを最初にマテリアライズしたりすることができます。代わりに、メモリ内のデータの関数を呼び出します。

ormでサポートされている場合は、関数の機能を含むストアド・プロシージャをsqlで作成し、ormを介してストアド・プロシージャをコールすることもできます。

+0

はい、どうですかそれは質問です。 –

+1

次に、ToList()を呼び出してクエリーをマテリアライズし、データに対して操作/関数呼び出しを実行できます。あなたはそれの意味を考える必要があります。 – Tarek

-1

私はこのようにそれをやった:

 var CProcess = (from m in DataContext.csrcallds.AsEnumerable() 
         where m.scheduledon >= earliestDate 
         && m.scheduledon <= objdate1.DateStart 
         && m.calltype == "CHQRUN" 
         && (SqlMethods.DateDiffDay(FluentDateTime.DateTimeExtensions.AddBusinessDays((DateTime)m.scheduledon, 2), m.completedon) > 2) 
         group m by new { m.scheduledon.Value.Year, m.scheduledon.Value.Month } into p 
         orderby p.Key.Year ascending, p.Key.Month ascending 
         select new Date1() 
         { 
          theDate = DateTime.Parse($"{p.Key.Month} - {p.Key.Year}"), 
          theCount = p.Count(), 
          theString = $"{p.Key.Month} - {p.Key.Year}" 
         }); 

を私は.AsEnumerableを()を使用して、クエリ内の方法を使用していました。

+0

@GertArnoldが編集しました。 –

+0

私はdownvoteをしませんでしたが、 'AsEnumerable()'を使うことは、すべての述語の前に適用すると[非常に悪い解決法](http://stackoverflow.com/a/17996264/861716)、*特に*です。 –

関連する問題