2015-07-03 74 views
1

我存储从两个表中var匿名类型变量加入:如何会话匿名类型?

var results = from t in db.Table1 
       join j in db.Table2 on t.IDCourse equals j.IDCourse 
       select new { t, j }; 

现在,我需要做的就是这种类型的对象存储在会话。但是我需要指定对象的类型。

results.GetType()我:

System.Data.Linq.DataQuery`1[<>f__AnonymousType0`2[Table1,Table2 ]] 

,但我不知道如何在普通型翻译这个。你会如何做这种“转换”?

+3

要么引入一个新的类型和映射到它,要么读为“动态”。 – CodeCaster

+0

@CodeCaster:使用'dynamic'我以后不能进行分组或进行LINQ查询。这将是这种“新型”?这是一个问题... – markzzz

+0

@markzzz:你真的需要这两种类型的匿名类型吗?由于两者都是相关/链接的,因此可以使用'Table2'属性扩展'Table1'。然后你只需要存储'Table1'实例,但是你可以使用它的属性'Table2'(选择更好的名字)。 –

回答

1

Linq-To-Sql类生成为部分。这意味着您可以使用声明为partial的相同类名的单独代码文件来添加所需的额外属性。在此列表中

var results = from t in db.Table1 
       join j in db.Table2 on t.IDCourse equals j.IDCourse 
       select new { t, j }; 
foreach(var x in results) 
    x.t.Table2 = x.j; 
return results.Select(x => x.t).ToList(); 

现在每Table1例如:

public partial class Table1 
{ 
    .... auto generated stuff .... 
} 

如何你可以扩展它,像这样创建另一个文件:

public partial class Table1 
{ 
    public Table2 Table2{ get; set; } 
} 

然后你就可以通过这种方式创建一个实例包含Table2作为财产。

+0

哦不,我不会碰LINQ-To-SQL类。由于在数据库上进行了编辑,因此删除表格并重新导入它们时,我在过去遇到过很多问题。 – markzzz

+0

@markzzz:然后去一个全新的班级。但是通过使用单独的代码文件,自动生成的东西不会与其他部分类冲突。 –

+0

不知道如果我看到它是正确的,但为什么在LINQ中使用连接它使“两个”表/类? Join意味着“连接”,所以应该使用单个对象:O – markzzz

0

如果你创建视图模型(如果它是Web视图):

class YourViewModel() 
{ 
    public object Table1 {get; set;} 
    public object Table2 {get; set;} 

    YourViewModel(dynamic LINQResult) 
    { 
     this.Table1 = LINQResult.prop1; 
     this.Table2 = LINQResult.prop2; 
    } 
} 

更改对象的类型和道具等你的名字的名字。

1

下面是一个例子类存储两个对象的你需要:

public class TableStorage 
{ 
    public Table1 Table1 {get;set;} 
    public Table2 Table2 {get;set;} 
} 
... 
var results = (from t in db.Table1 
       join j in db.Table2 on t.IDCourse equals j.IDCourse 
       select new TableStorage { Table1 = t, Table2 = j }).ToList(); 

现在保存在会话中results

Session["TableData"] = results;

然后,您可以取回数据:

List<TableStorage> data = (List<TableStorage>)Session["TableData"];

这可能是也可能不是你所需要的,所以随时发表评论。

+0

但是表(连接后)成为一个独特的表。为什么在你的例子中有一个表的列表? – markzzz

+0

独特的表?我不确定我是否遵守。在你的例子中,你创建一个匿名类型,正如你发现并不总是最好的方法。在这里,'TableStorage'本质上是一个包装器,用于存储从你的数据库中带回来的数据的引用,并且可以被存储/检索。 – Ric