実際のコードはもっと複雑なので、この例を単純化しようとしました。この例はばかげているように見えるかもしれませんが、ご容赦ください。たとえば、AdventureWorks データベースを操作していて、いくつかの場所で使用したいコードを含む式を返すテーブルに呼び出さBlarg
れるプロパティを追加することにしました。Product
public partial class Product
{
public Expression<Func<Product, string>> Blarg
{
get { return product => product.ProductModelID.HasValue ? "Blarg?" : "Blarg!"; }
}
}
私がやりたいのは、式の式ツリーを作成し、Product.Blarg から Expression を取得し、結果によってグループ化することです。このようなもの:
var productParameter = Expression.Parameter(typeof(Product), "product");
// The Problem
var groupExpression = Expression.Lambda<Func<Product, string>>(
Expression.Invoke(
Expression.Property(productParameter, "Blarg"),
productParameter),
productParameter);
using (AdventureWorksDataContext db = new AdventureWorksDataContext())
{
var result = db.Products.GroupBy(groupExpression).ToList();
// Throws ArgumentException: "The argument 'value' was the wrong type.
// Expected 'System.Delegate'.
// Actual 'System.Linq.Expressions.Expression`1[System.Func`2[LINQ_Test.Product,System.String]]'."
}
明らかgroupExpression
に間違っています (例外についてはコードのコメントを参照してください) が、どうすればよいかわかりません。私が言っていると思ったのは、「 から Expression を取得し、product.Blarg
それを実行して、文字列の結果を返す」ということです。でも、それは私が実際に言っていることではないと思います。私はまだ式ツリーを理解しようとしています。どうすればこれをやってのけることができますか?