タイトルは私が探しているものを表していると思います。これが私が達成しようとしていることの例です。
エンティティがあります (実行時に CodeDom で生成されるものもあります)
public abstract class Content
{
public virtual Page Parent { get; set; }
public virtual ISet<Property> Properties { get; set; }
// T GetPropertyValue<T>(string)
// SetPropertyValue(string, object)
}
public abstract class Page : Content
{
public virtual string Path { get; set; }
}
// Generated with CodeDom
public class Post : Page
{
public virtual string Text
{
get
{
// get value from Properties
return GetPropertyValue<string>("Text");
}
set
{
// set value to Properties
SetPropertyValue("Text", value);
}
}
}
NHibernate を使用して項目を照会しています。
問題: Post.Text
Where 句で使用できません。
解決策: ラムダ式を別の形式に変換する独自の拡張メソッドを作成します。
例: クエリ
var posts = session.Query<Post>().Filter(p =>
p.Parent.Path.StartsWith("/blogs/programming/") &&
p.Text.Contains("hello"));
次のいずれかに変換できます
public static IQueryable<T> Filter<T>(this IQueryable<T> query, Expression<Func<T, bool>> filterExpr)
{
return query.Where(p =>
p.Parent.Path.StartsWith("/blogs/programming/") &&
p.Properties.OfType<StringProperty>().Any(p2 =>
p2.Name == "Text" &&
p2.StringValue.Contains("hello")));
}
public static IQueryable<T> Filter<T>(this IQueryable<T> query, Expression<Func<T, bool>> filterExpr)
{
var ids1 = session.Query<Content>().Where(p =>
p.Parent.Path.StartsWith("/blogs/programming/"))
.Select(p => p.Id);
var ids2 = session.Query<StringProperty>().Where(p =>
p.Name == "Text" &&
p.StringValue.Contains("hello"))
.Select(p => p.Content.Id);
var ids = ids1.Intersect(ids2);
return query.Where(p => ids.Contains(p.Id));
}
重要な例やオープンソース プロジェクトはありますか?