微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过 EF6 将 SQLQuery 转换为 SortedList

如何解决如何通过 EF6 将 SQLQuery 转换为 SortedList

我有一个名为 func getobj(x interface{}) (o Object,ok bool) { // First try the trivial cases: switch v := x.(type) { case Object: return v,true case map[string]interface{}: return Object(v),true } // Then revert to reflection: if v := reflect.ValueOf(x); v.Type().Convertibleto(objType) { o,ok = v.Convert(objType).Interface().(Object) return } return nil,false } 的实体框架 6 类,它在我的数据库中反映为同名表。使用父参数,我需要从 sql 查询返回材料的排序列表,以便我以后可以检查用户所做的编辑是否不会影响订单。我的 sql一个看起来像这样的存储过程:

Materials

如您所见,CREATE PROC [dbo].[GET_SortedMaterials](@FinishedGoodCode VARCHAR(50)) AS SELECT ROW_NUMBER() OVER (ORDER BY Component.Percentage_of_Parent DESC,Material.Material) AS _sortField,Material.* FROM Components AS Component INNER JOIN Materials AS Material ON Component.Child_Material = Material.Material WHERE Component.Parent_Code = @FinishedGoodCode ORDER BY Component.Percentage_of_Parent DESC,Material.Material 字段未包含在 orderby 中。出于这个原因,我觉得我不能只返回一组 Material 对象并仍然保持排序 - 我已经在 sql 中执行了排序并添加Material(我认为该字段可能是一个不好的想法)。

我用来读取 sql 的 C# 代码如下所示:

_sortField

代码执行时,我得到了正确的返回行数,但我没有得到一个排序列表,其中 public async Task<SortedList<int,Materials>> GET_SortedMaterials(IProgress<Report> progress,string finishedGoodCode) { try { var report = new Report { Message = "Retrieving Sorted Materials",NewLine = true,StatusCode = Enums.StatusCode.Working }; progress.Report(report); using (var context = new DBContext()) { var ingredientList = await context.Database.sqlQuery<(int _sortField,Materials mat)>("[app].[GET_Customers]").ToListAsync(); var sorted = new SortedList<int,Raw_Materials>(); foreach (var (_sortField,mat) in ingredientList.OrderBy(x=>x._sortField)) { sorted.Add(_sortField,mat); } return sorted; } } catch (Exception ex) { [EXCLUDED CODE] } } 对应于 Key 值,而 _sortField 对应于Value 值。我尝试了基本相同代码的各种不同版本,但我无法让脚本返回包含有关其排序信息的材料列表,相反,向 EF 类的转换完全失败,我只返回空值:

Unhappy Results

关于如何从 sql 返回排序列表并在 C# 中维护排序的任何建议,当排序字段不在返回值中时,将非常感谢。

解决方法

使用

var ingredientList = await context.Database.SqlQuery<Materials>("[app].[GET_Customers]").Select((mat,_sortField) => (_sortField,mat)).ToDictionary(x => x._sortField,x => x.mat);

或者如果你想要异步加载使用

var ingredientList = await context.Database.SqlQuery<Materials>("[app].[GET_Customers]").ToListAsync().Result.Select((mat,x => x.mat);

完整代码

public async Task<SortedList<int,Materials>> GET_SortedMaterials(IProgress<Report> progress,string finishedGoodCode)
{
   try
   {
       var report = new Report { Message = "Retrieving Sorted Materials",NewLine = true,StatusCode = Enums.StatusCode.Working };
       progress.Report(report);
       using (var context = new DBContext())
       {
           var ingredientList = await context.Database.SqlQuery<Materials>("[app].[GET_Customers]").ToListAsync().Result.Select((mat,x => x.mat);
           var sorted = new SortedList<int,Raw_Materials>();
           foreach (var item in ingredientList.OrderBy(x => x.Key))
           {
               sorted.Add(item.Key,item.Value);
           }
           return sorted;
       }
   }
   catch (Exception ex)
   {
      [EXCLUDED CODE]
   }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。