這是我的場景:我需要從一個實體中使用「OR」查詢對鏈接實體中的屬性提取數據。執行一個linq樹表達式到這裏
這是我的實體:
public class Dealer
{
public virtual int id{get;set;}
public virtual string name{get;set;}
public virtual IList<Car> Cars{get;set;}
}
public class Car
{
public virtual int id{get;set;}
public virtual string name{get;set;}
public virtual int kw{get;set;}
}
例子:我想提取與98千瓦或百千瓦汽車所有經銷商。 SQL示例:
SELECT Dealers.* FROM Dealers INNER JOIN Cars ON Cars.IdDealer = Dealers.Id WHERE Cars.kw = 98 OR Cars.kw = 100
我試圖用表達式樹,但我不知道如何使用它們。 我嘗試這樣做:
var dealers = Session.Linq<Dealers>();
ParameterExpression pe = Expression.Parameter(typeof(int), "kw");
Expression tot = null;
var powers = new int[2]{98, 100};
for (var i = 0; i < powers.Length; i++)
{
Expression right = Expression.Constant(int.Parse(powers[i]));
if (i > 0)
tot = Expression.Or(tot, Expression.Equal(pe, right));
else
tot = Expression.Equal(pe, right);
}
dealers = dealers.Where(x => x.Cars.Any(Expression.Lambda<Func<Cars, bool>>(tot, null)));
,但我得到的最後一行,這些編譯器錯誤,我試圖執行的表達式:
- 無法轉換lambda表達式類型
string
,因爲它不是一個委託類型 System.Collections.Generic.IList<Cars>
不包含Any
的定義和最佳擴展方法重載System.Linq.Enumerable.Any(System.Collections.Generic.IEnumerable,System.Func)有一些無效參數- 參數2:不能從
System.Linq.Expressions.Expression<System.Func<Cars,bool>>
轉換爲System.Func<Cars,bool>
有什麼建議?
什麼「編譯器錯誤」? –
我可以提出一些建議,可能會或可能不會受到歡迎。在我看來,你應該避免在開放環境中以這種方式使用RAW表達式。我會衷心建議你採用更加封閉的方法,並看看像albahari predicatebuilder:http://www.albahari.com/nutshell/predicatebuilder.aspx會爲你節省很多挫折。在頁面上的一些很好的工作示例 –
@KonradMorawski添加了有問題的錯誤列表 – Albirex