C# 如何在“按查询分组”中调用没有linq的C方法

C# 如何在“按查询分组”中调用没有linq的C方法,c#,sql,sql-server,asp.net-mvc,group-by,C#,Sql,Sql Server,Asp.net Mvc,Group By,我编写了一个运行良好的LINQ查询,LINQ查询有一个group by语句,它使用我的C方法将DateTime从Miladi转换为hejri。现在我的目的是:用原始sql编写这个linq查询 这是我的NewsModel类: 现在我想用原始sql查询实现这一点,正如你在LINQ查询中看到的,我使用了date.GetYear和date.GetMonthName方法,它们是C方法,但我不能在诸如select date.GetYearfoo之类的原始sql查询中使用它们 根据您的评论,您希望在表记录中获

我编写了一个运行良好的LINQ查询,LINQ查询有一个group by语句,它使用我的C方法将DateTime从Miladi转换为hejri。现在我的目的是:用原始sql编写这个linq查询

这是我的NewsModel类:


现在我想用原始sql查询实现这一点,正如你在LINQ查询中看到的,我使用了date.GetYear和date.GetMonthName方法,它们是C方法,但我不能在诸如select date.GetYearfoo之类的原始sql查询中使用它们

根据您的评论,您希望在表记录中获得包含相应月份列表的年份,要做到这一点,您不需要本地函数:

string query = "select DISTINCT DATEPART(YEAR, dbo.News.DateUpdate) as Year, "
             + "DATEPART(YEAR, dbo.News.DateUpdate) as Month"
             + "from dbo.News";

List<DataHolder> A = db.News.SqlQuery(query).ToList();

var results = (from a in A
                group a by a.Year into grp
                select new
                {
                    Year = grp.Key,
                    Months = grp.Select(x => x.Month).ToList()
                }).ToList();

年份是查询返回的字段,它选择foo作为YearsA是db.news.SqlQueryselect Yearfoo作为Years from news的结果;现在我怎么能有访问年,而不是默认的函数年,我想在cSo中使用我自己的函数你想让你的SQL语句调用一个C函数?您必须将该函数构建到程序集中,从SQL server引用该程序集,创建使用该程序集函数的UDF,并在GROUP BY中调用该UDF。没有比这更简单的了。你的问题和愿望很清楚,但答案是一样的——没有简单的方法从SQL调用C函数。您可能能够在SQL中编写一个与getyear等效的函数,但这完全取决于函数的功能,而且您还没有证明要确定。EF与其他Linq提供程序一样,有一个Linq解释器,该解释器将查询作为一组表达式和函数调用进行分析,确定每个表达式是否具有SQL等效项,并从中构建SQL语句。我不知道GetYear做了什么,尽管我可以很好地猜测SQL等价物是什么。如果你有一个Linq查询可以工作,你可以得到一个Linq分析器来获取它生成的SQL并尝试使用它。我想要第二个解决方案ty作为答案,但问题是在你的第二个解决方案中没有a。年!我不知道Years@Saeid你在新闻课上没有“Years”吗?没有,我没有,这只是sql查询的结果,选择foo asYears@Saeid您需要将其public int Years{set;get;}添加到类“Years”中,否则该值将丢失@我不明白你的c函数到底是做什么的。你能把它贴在你的问题上吗?
var Archives = from Records in news
    group Records by new { Years = date.GetYear(Records.DateUpdate, ConvertTime.UTCtoIran) } into GYears
    select new { Years = GYears.Key.Years, Months = (from r in GYears group r by date.GetMonthName(r.DateUpdate) into Gmonths select Gmonths.Key) }.ToExpando();

ViewBag.Archive = Archives;
string query = "select DISTINCT DATEPART(YEAR, dbo.News.DateUpdate) as Year, "
             + "DATEPART(YEAR, dbo.News.DateUpdate) as Month"
             + "from dbo.News";

List<DataHolder> A = db.News.SqlQuery(query).ToList();

var results = (from a in A
                group a by a.Year into grp
                select new
                {
                    Year = grp.Key,
                    Months = grp.Select(x => x.Month).ToList()
                }).ToList();