問題描述
我之前使用過基于 lamdas 的 C# 表達式,但我沒有手工編寫它們的經(jīng)驗.給定一個 Expression
,我想創(chuàng)建一個Expression
.
I have used C# expressions before based on lamdas, but I have no experience composing them by hand. Given an Expression<Func<SomeType, bool>> originalPredicate
, I want to create an Expression<Func<OtherType, bool>> translatedPredicate
.
在這種情況下 SomeType 和 OtherType 具有相同的字段,但它們不相關(guān)(沒有繼承,也不是基于公共接口).
In this case SomeType and OtherType have the same fields, but they are not related (no inheritance and not based on a common interface).
背景:我有一個基于 LINQ to SQL 的存儲庫實現(xiàn).我將 LINQ to SQL 實體投影到我的模型實體,以將我的模型保存在 POCO 中.我想將表達式傳遞給存儲庫(作為規(guī)范的一種形式),但它們應該基于模型實體.但我無法將這些表達式傳遞給數(shù)據(jù)上下文,因為它需要基于 LINQ to SQL 實體的表達式.
Background: I have a repository implementation based on LINQ to SQL. I project the LINQ to SQL entities to my Model entities, to keep my model in POCO. I want to pass expressions to the repository (as a form of specifications) but they should be based on the model entities. But I can't pass those expressions to the data context, since it expects expressions based on the LINQ to SQL entities.
推薦答案
用Expression
,最簡單的方法就是用一個轉(zhuǎn)換表達式:
With Expression
, the simplest way is with a conversion expression:
class Foo {
public int Value { get; set; }
}
class Bar {
public int Value { get; set; }
}
static class Program {
static void Main() {
Expression<Func<Foo, bool>> predicate =
x => x.Value % 2 == 0;
Expression<Func<Bar, Foo>> convert =
bar => new Foo { Value = bar.Value };
var param = Expression.Parameter(typeof(Bar), "bar");
var body = Expression.Invoke(predicate,
Expression.Invoke(convert, param));
var lambda = Expression.Lambda<Func<Bar, bool>>(body, param);
// test with LINQ-to-Objects for simplicity
var func = lambda.Compile();
bool withOdd = func(new Bar { Value = 7 }),
withEven = func(new Bar { Value = 12 });
}
}
但是請注意,不同的提供商會對此提供不同的支持.例如,EF 可能不喜歡它,即使 LINQ-to-SQL 喜歡.
Note however that this will be supported differently by different providers. EF might not like it, for example, even if LINQ-to-SQL does.
另一種選擇是完全重建表達式樹,使用反射找到對應的成員.復雜得多.
The other option is to rebuild the expression tree completely, using reflection to find the corresponding members. Much more complex.
這篇關(guān)于C#如何轉(zhuǎn)換一個表達式<Func<SomeType>>到表達式<Func<OtherType>>的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!