3

select 句を実行しようとしたときに作成した既存の Expression 構築クラスを使用しようとしていますが、Select の式ツリーに式をアタッチする方法がわかりません。次のことを試しました。

var catalogs = matchingCatalogs.Select(c => new
                {
                    c.CatalogID,
                    Name = EntitiesExpressionHelper.MakeTranslationExpression<Catalog>("Name", ApplicationContext.Instance.CurrentLanguageID).Compile().Invoke(c),
                    CategoryName = EntitiesExpressionHelper.MakeTranslationExpression<Category>("Name", ApplicationContext.Instance.CurrentLanguageID).Compile().Invoke(c.Category),
                    c.CategoryID,
                    c.StartDateUTC,
                    c.EndDateUTC
                });

しかし、明らかに、Entity Framework が Invoke を SQL メソッドにマップできないというエラーが表示されます。これを回避する方法はありますか?

参考までに、EntitiesExpressionHelper.MakeTranslationExpression<T>(string name, int languageID) は次と同等です。

x => x.Translations.Count(t => t.LanguageID == languageID) == 0 ? x.Translations.Count() > 0 ? x.Translations.FirstOrDefault().Name : "" : x.Translations.FirstOrDefault(t => t.LanguageID == languageID).Name

編集:これを達成するには ExpressionVisitor を使用する必要があることは理解していますが、ExpressionVisitor を使用して MemberInitExpression を変更する方法がわからないため、これを達成する方法を誰かが知っている場合はお知らせください。

4

1 に答える 1

1

vars で式をキャプチャする必要があります。匿名型は使用できません。一般的な考え方は、これが機能するということです:

Expression<Func<Foo, Bar>> exp = GenExpression();
var q = matchingCatalogs.Select(exp);

しかし、これはしません:

var q = matchingCatalogs.Select(GenExpression());

最初のものは喜んで結果GenExpressionL2E に渡します。2 番目は、結果ではなく、GenExpression 自身を L2Eに渡そうとします。

したがって、式と同じ型の var への参照が必要です。これらは暗黙的に型指定できないため、結果の型には実際の型が必要です。

于 2010-07-27T21:58:33.783 に答える