0

タイトルは私が探しているものを表していると思います。これが私が達成しようとしていることの例です。

エンティティがあります (実行時に 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.TextWhere 句で使用できません。
解決策: ラムダ式を別の形式に変換する独自の拡張メソッドを作成します。

例: クエリ

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));
}

重要な例やオープンソース プロジェクトはありますか?

4

1 に答える 1

0

おそらく、私の LINQ から OpenCL へのトランスレータである Brahma をご覧になることもできます。http://brahma.codeolex.com

それはあなたが達成したいことと非常によく似た何かをします。

お役に立てれば!

于 2012-05-30T12:43:28.547 に答える