在LINQ中为存储过程设置多对象返回类型
解决LINQ中存储过程返回多类型的方案
嘿,这个需求我之前帮朋友处理过,不用大改原有逻辑就能实现,给你几个实用的办法:
1. 自定义复合类型(最推荐,适合复用)
你可以创建一个包含视图和表所有字段的自定义类,让存储过程返回这个复合类型,这样就能在LINQ里直接映射,完美兼容原有逻辑。
步骤示例:
首先定义复合类,把视图和表的属性都放进去:
// 自定义复合结果类,对应存储过程返回的所有字段 public class ViewTableCombined { // 视图的属性(和你原视图类型的字段一致) public int ViewId { get; set; } public string ViewTitle { get; set; } // 表的属性(和你原表类型的字段一致) public int TableRecordId { get; set; } public DateTime CreateTime { get; set; } public string Content { get; set; } }
然后修改LINQ中存储过程的映射配置,指定返回这个复合类型:
[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.GetViewTableCombinedData")] [return: global::System.Data.Linq.Mapping.ResultType(typeof(ViewTableCombined))] public IQueryable<ViewTableCombined> GetViewTableCombinedData() { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod()))); return ((IQueryable<ViewTableCombined>)(result.ReturnValue)); }
最后调用的时候,你可以把复合类拆成原来的视图和表类型:
var combinedData = db.GetViewTableCombinedData().ToList(); var originalStyleData = combinedData.Select(item => new { ViewData = new YourOriginalViewType { Id = item.ViewId, Title = item.ViewTitle }, TableData = new YourOriginalTableType { RecordId = item.TableRecordId, CreateTime = item.CreateTime, Content = item.Content } });
2. 用匿名类型快速适配(适合局部场景)
如果只是在某个局部需要这种返回格式,不用定义新类,直接在查询时用匿名类型包装原视图和表类型:
// 假设存储过程已经返回了所有关联字段 var results = from spItem in db.YourStoredProcedure() select new { // 直接实例化原视图类型 ViewObj = new YourOriginalViewType { Id = spItem.ViewId, Name = spItem.ViewName }, // 直接实例化原表类型 TableObj = new YourOriginalTableType { Id = spItem.TableId, Data = spItem.TableData } };
3. 用ValueTuple打包(简洁写法)
如果用的是C# 7.0+,可以用ValueTuple直接把两个类型打包返回,代码更简洁:
var results = db.YourStoredProcedure() .Select(sp => ( View: new YourOriginalViewType { Id = sp.ViewId, Name = sp.ViewName }, Table: new YourOriginalTableType { Id = sp.TableId, Data = sp.TableData } )); // 使用的时候直接解构 foreach (var (view, table) in results) { // 处理view和table对象 }
关键注意点:
- 确保你的存储过程返回的列名和你要映射的属性名一致,或者用
[Column(Name = "数据库列名")]标注自定义类的属性来对应。 - 存储过程本身要返回视图和表关联后的所有字段,这样才能完整映射到两个类型。
内容的提问来源于stack exchange,提问作者Programmermid
相关产品推荐
相关产品推荐

