2010-10-17 57 views
1

我想連接兩個對象,第一個是在助手中定義的(靜態)本地對象,第二個是(Subsonic)數據庫對象。Linq查詢連接具有不同數據源的對象?

這是從我的存儲庫的違規摘錄,我不會讓你的模型和助手,除非請求。

公衆的IQueryable的GetData(字符串數據類型) {

 IQueryable<DatabaseObject> datalist = (
      from t in db.All<DatabaseObject>() 
      join e in WebHelpers.LocalList.AsQueryable<LocalObject>() 
      on t.Type equals e.Type 
      orderby t.DateOccurred descending 
      select t 
     ).Where(e => e.Category == TransType); 

     return datalist; 
    } 

我意識到,我可以我我的生活更輕鬆把此表到數據庫中1000倍,併爲下一個版本我可以很好地做到這一點。但是有沒有辦法實現我想要做的?我認爲這是要麼(一)我沒有返回正確的數據類型,因爲視圖模型期望IQueryable或(b)亞音速引起的問題。

回答

1

我最終的解決方案是重新組織where子句以確保select只返回正確的數據類型(IQueryable)。在不重新組織where子句的情況下,儘管指定了select t,但連接數據仍然通過對象。

public IQueryable GetData(string DataType) 
{ 

    IQueryable<DatabaseObject> dbData = (
     from t in db.All<DatabaseObject>().Where(e => e.Category == TransType) 
     join e in WebHelpers.LocalList 
     on t.Type equals e.Type 
     orderby t.DateOccurred descending 
     select t 
    ); 

    return dbData; 
} 
+1

你*仍*有一個未使用的參數'數據類型';你仍然*引用一個變量'TransType',這個變量不在任何地方聲明;而你仍*使用變量名稱't'和'e'不一致。 – Timwi 2010-10-24 18:13:09

2

我擔心SubSonic不支持這種交叉引用(至少它沒有上次我嘗試過)。

您可以解決此通過使用亞音速只從數據庫中檢索必要的數據,但後來做正常的C#中加入Linq到對象:

public IQueryable GetData(string DataType) 
{ 
    // Get a list of the types we need 
    var requiredTypes = WebHelpers.LocalList.Select(l => l.Type) 
            .Distinct().ToArray(); 

    // Retrieve all the relevant rows from the database 
    var dbData = db.All<DatabaseObject>() 
            .Where(d => requiredTypes.Contains(d.Type)) 
            .ToArray(); 

    // Do the join locally 
    return (
     from t in dbData 
     join e in WebHelpers.LocalList 
     on t.Type equals e.Type 
     orderby t.DateOccurred descending 
     select t 
    ).Where(e => e.Category == TransType); 
} 

(順便說一句,你可以如果你將.Where()移動到orderby以上,可能會獲得更好的性能,因爲那麼排序的次數就會減少,或許你甚至可以將它包含在數據庫查詢中(檢索dbData的那個查詢),因爲你的代碼很混亂因爲它引用了您尚未在任何地方聲明的TransType,並且該方法的參數DataType未使用在那裏,你使用te不一致。)

+0

這也有同樣的問題,正確的數據類型沒有返回 – Gavin 2010-10-21 12:54:03