2011-08-10 32 views
1

我有許多從相同基類繼承的LINQ類。每個Linq類都有它自己的表,然後基類是到另一個表的一種鏈接。我會試着說明的關係:具有接口的C#Linq查詢

//Base Class 
abstract class Element<T> 
{ 
    public string Name {get; set;} 
    public string Species {get; set;} 
} 

public partial class DogElement : Element<DogElement> 
{ 
    public int Legs {get; set;} 
    public bool hasHair {get; set;} 
} 

public partial class CatElement : Element<CatElement> 
{ 
    public bool hasWiskers {get; set} 
} 

所以DogElement和CatElement是數據庫中不同的物理表。 Species類將從Species表中讀取。我基本上想在Element中有一個通用函數,它將T表與Species表分組,並在設置.Species之後將結果作爲T返回。

//Assume T is DogElement for this example 
public IQueryable<T> Collection 
{ 
    using (DataBase db = new DataBase()) 
    { 
    var k = from t in db.GetTable<T>() 
      where t.SomeID == SomeOtherID 
      select t; 

    k = { {Legs = 4, HasHair = True, Species = <null>, Name = <null>}, ...} 

    I basically want a query that will return an IQueryable<DogElement> with Name 
    and Species set from a join query. What is the best way to set the Name and 
    Species values? 

    return k; 
} 
+0

類抽象元素→抽象類元素 shenhengbin

回答

-1

本質上,你要求SQL來處理繼承(它不這樣做)......並且LINQ也不建模繼承。一個好的對象關係映射器(ORM)可以幫助你將更多的東西拼湊在一起。

這就是說,這裏是一個快速討論。

首先,我認爲最好爲每個物種 - 動物對寫一個LINQ查詢。

你可以編寫一個聯合體,在LINQ選擇中切換,創建一個新的動物,然後將該動物一次性投射到一個物種......然後在LINQ聲明之外,在出口的路上將其重鑄爲T.這種說法聽起來很亂。

雖然這不如一個大的工會聲明效率,你有沒有考慮這個更可維護的選項?

var a from speciies select .. 

if(T is Dog){ 
    additional linq statement} 
else if(T is Cat){ 
    additional linq statement} 

這兩趟數據庫(慢),但它更容易維護,而且往往是最好不要過度優化第一遍你的代碼。

+0

我想過了,這將是我的倒退。我在想這樣做會有一種靈活的方式。如何處理這樣的變化: '(從k in(從db到db.whatever選擇s中的s)加入h到db.h中k.ID等於h.ID組到E select E).Cast ( )' – Cameron

+0

作爲物種 - 動物配對,並且您根據typeof(T)選擇執行哪些配對,是的。這是我的首選。會有一些重疊,但至少基類部分是可預測的。 – sgtz

+0

好的。謝謝您的幫助。 – Cameron