如何解决如何通过 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
(我认为该字段可能是一个不好的想法)。
_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 类的转换完全失败,我只返回空值:
关于如何从 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 举报,一经查实,本站将立刻删除。