2010-10-17 109 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