linq to sql要注意的及存储过程多结果集实现

 using (DataClasses1DataContext a = new DataClasses1DataContext())
 {

}

这样写比较方便

更新时,如果表没有主键,那不会更新,也不会报错,设了主键后,重开连接,重新拖一个到Context里面

如果表的映射类不是从context里面搜出来的,而是自己new的

用context.表类.Attach(外面的类,true/false)更新

 

对于调用存储过程,反正多个表

一般讲,存储过程都会拖到datacontext里面,成为context里面的一个方法

如果什么都不改的话,那存储过程只会返回一个结果集,所以我们要改一下,

 将DataClasses1.dbml用xml打开(MS这里做的很不好,很多人都不知道怎么用xml打开dbml文件),右选DataClasses1.dbml,选择打开方式,里面就有xml方式打开

你可以发现<function>节点,比如

<Function Name="dbo.temselect" Method="temselect" HasMultipleResults="true">
    <ElementType Name="Table_11" >
      <Column  Name="id" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
      <Column Name="a" Type="System.Int32" DbType="Int" CanBeNull="true" />
      <Column Name="b" Type="System.String" DbType="NVarChar(50)" CanBeNull="true" />
    </ElementType>

</Function>

temselect 这个存储过程有多少结果集的话,就改一改这个xml

<Function Name="dbo.temselect" Method="temselect" HasMultipleResults="true">
    <ElementType Name="Table_11" >
      <Column  Name="id" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
      <Column Name="a" Type="System.Int32" DbType="Int" CanBeNull="true" />
      <Column Name="b" Type="System.String" DbType="NVarChar(50)" CanBeNull="true" />
    </ElementType>
      <ElementType Name="Table_22">
        <Column Name="id" Type="System.Int32" DbType="Int NOT NULL"  CanBeNull="false" />
        <Column Name="name" Type="System.String" DbType="NChar(10)" CanBeNull="true" />
        <Column Name="age" Type="System.Int32" DbType="Int" CanBeNull="true" />
    </ElementType>
  </Function>

就行了,然后用

  DataClasses1DataContext d = new DataClasses1DataContext();
            IMultipleResults im = d.temselect();
            List<Table_11> a = im.GetResult<Table_11>().ToList<Table_11>();
            List<Table_22> b = im.GetResult<Table_22>().ToList<Table_22>();

获得两个数据集

 

下面还有一个问题,就是如果表名叫table_1,那存储过程返回的类名就不能叫table_1,如果是用select * 的话,要就涉及到结构相同的类的转换问题

现在好像没有什么好的解决方案,但一般的解决方案还是有的,可以这样做

<Table Name="dbo.Table_1" Member="Table_1">
    <Type Name="Table_1">
      <Column  Modifier="Virtual" Name="id" Type="System.Int32" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
      <Column Modifier="Virtual" Name="a" Type="System.Int32" DbType="Int" CanBeNull="true" />
      <Column Modifier="Virtual" Name="b" Type="System.String" DbType="NVarChar(50)" CanBeNull="true" />
    </Type>
  </Table>

把table_1的xml的列里面加个虚方法,在项目里建个partial类,让table_11 继承table_1

再把

<ElementType   Name="Table_11" >
      <Column Modifier="Override"  Name="id" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
      <Column Modifier="Override" Name="a" Type="System.Int32" DbType="Int" CanBeNull="true" />
      <Column Modifier="Override"  Name="b" Type="System.String" DbType="NVarChar(50)" CanBeNull="true" />
    </ElementType>

然后再

im.GetResult<Table_11>().ToList<Table_11>().cast一下,就可以了,不过还是很麻烦,以后争取避免吧;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值