設置一般屬性我有一個看起來像這樣多個查詢:如何使用LINQ選擇
var query = from a in EntityAs
select new EntityASmall()
{
// Common Stuff:
Id = a.Id,
Name = a.Name,
ShortName = a.ShortName,
// Specific to EntityA:
ASpecificProperty1 = a.1,
ASpecificProperty2 = a.2
};
var query = from b in EntityBs
select new EntityBSmall()
{
// Common Stuff:
Id = b.Id,
Name = b.Name,
ShortName = b.ShortName,
// Specific to EntityB:
BSpecificProperty1 = b.1,
BSpecificProperty2 = b.2
};
EntityA和EntityB都從具有Id
,Name
和ShortName
性質的公共基類派生。 EntityASmall
和EntityBSmall
也一樣。我有很多看起來像這樣的查詢,所以我想做一些簡寫查詢,首先將常見的東西排除在外。我發現了一個有點前途的擴展方法,看起來像這樣:
public static TSource SetCommonProperties<TSource>(this TSource input, EntityBaseClass entity, Action<TSource> updater) where TSource : EntitySmallBase
{
input.Id = entity.Id;
input.Name = entity.Name;
input.ShortName = entity.Name;
updater(input);
return input;
}
我可以用它像這樣:
var query = from a in EntityAs.AsEnumerable()
select new EntityASmall().SetCommonProperties(a, x =>
{
ASpecificProperty1 = x.1;
ASpecificProperty2 = x.2;
});
注意AsEnumerable()
。沒有它,我得到「一個lambda表達式與一個語句正文不能轉換爲表達式樹」,我猜粗略的意思是它試圖將Action
部分轉換爲LINQ到SQL的表達式。看起來像AsEnumerable()
把它收集在本地的地方它的全部工作。對於長篇大論的文章感到抱歉,但是有沒有什麼表達式方法可以用來編寫可以與LINQ-to-SQL和Entity Framework一起使用的表達式?提前致謝。
'EntityAs'是'IQueryable <>'? –
難道你不能寫一個泛型方法'ProjectOntoSmall',它需要一個'TEntity'類型的參數並將其轉換爲'TEntitySmall'?如果你對這些類型參數施加約束,而這些參數必須從基類型中派生出來,那我想可能會起作用。 –