假設我有一個實體對象定義爲重用LINQ到實體表達<Func鍵<T, TResult>在選擇和轉移呼叫
public partial class Article
{
public Id
{
get;
set;
}
public Text
{
get;
set;
}
public UserId
{
get;
set;
}
}
根據論文的一些性質,我需要確定該物品可以刪除由給定的用戶。所以我添加一個靜態方法來做檢查。喜歡的東西:
public partial class Article
{
public static Expression<Func<Article, bool>> CanBeDeletedBy(int userId)
{
//Add logic to be reused here
return a => a.UserId == userId;
}
}
所以現在我能做的
using(MyEntities e = new MyEntities())
{
//get the current user id
int currentUserId = 0;
e.Articles.Where(Article.CanBeDeletedBy(currentUserid));
}
到目前爲止好。現在我想重新使用邏輯CanBeDeletedBy同時做一個選擇,是這樣的:
using(MyEntities e = new MyEntities())
{
//get the current user id
int currentUserId = 0;
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = ???
};
}
但無論我怎麼努力,我不能在選擇方法使用表達式。我猜如果我能做
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = a => a.UserId == userId
};
然後我應該可以使用相同的表達式。試圖編譯表達式,並通過這樣做來呼叫它
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = Article.CanBeDeletedBy(currentUserId).Compile()(a)
};
但它也不起作用。
關於如何使這項工作的任何想法?或者如果這是不可能的,那麼在兩個地方重用業務邏輯的替代方案是什麼?
由於
佩德羅
編譯表達式是正確的選擇,它編譯和爲我工作。如果是我,我也會列出彙編。你遇到了什麼錯誤 ? – 2010-03-15 12:03:04
是的,它編譯得很好,但引發NotSupportedException異常:「LINQ to Entities不支持LINQ表達式節點類型'Invoke'。「 試圖編譯表達式之外的選擇到Func並在裏面使用它,結果相同。 –
Pedro
2010-03-15 12:19:41
順便說一句,如果我使用普通的Func,並在 –
Pedro
2010-03-15 12:24:12