【发布时间】:2020-05-26 22:45:42
【问题描述】:
我正在学习 ASP.NET MVC,但我一直坚持使用实体框架创建复杂的 SQL - 它并不复杂,但它可能会变得复杂。
我的常规 ASP.NET C# 网络表单如下所示,我想将其转换为 ASP.NET MVC 并使用 Entity Framework。
string date = Request.QueryString["date"] ?? "";
string strWhere = "";
string sqlTop = "20";
DateTime temp;
if (DateTime.TryParse(date, out temp))
{
strWhere = "WHERE CAST(NewsDate AS date)='" + temp.ToString("yyyy-MM-dd") + "'";
sqlTop = "50";
}
using (SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["NewsDB"].ConnectionString))
{
con.Open();
string selectSql = @"SELECT TOP " + sqlTop + @" *
, (SELECT TOP 1 FileName
FROM NewsImage
WHERE NewsGuid = N.NewsGuid
ORDER BY FileOrder ASC) AS FileName
FROM News N " + strWhere + @"
ORDER BY N.NewsDate DESC";
using (SqlCommand selectCmd = new SqlCommand(selectSql, con))
{
using (SqlDataReader selectDr = selectCmd.ExecuteReader())
{
while (selectDr.Read())
{
//My Output logic goes here
}
}
}
}
我的问题是如何使用实体框架实现这种类型的 SQL。
我已经使用数据库优先的方法创建了实体并设置了DbContext。
private NewsEntities db = new NewsEntities();
我有两个数据库表:News & NewsImage 单个新闻可以有多个新闻图像(1-N)
我尝试过实现这样的目标:
新闻类
public class NewsClass
{
public News NewsDetails { get; set; }
public NewsImage NewsImages { get; set; }
}
型号:新闻
public partial class News
{
public int Id { get; set; }
public System.Guid NewsGuid { get; set; }
public string Heading { get; set; }
public string Text { get; set; }
public string Author { get; set; }
public System.DateTime NewsDate { get; set; }
}
模型:NewsImage
public partial class NewsImage
{
public int Id { get; set; }
public System.Guid NewsGuid { get; set; }
public string FileName { get; set; }
public int FileOrder { get; set; }
}
控制器:
var newsList = from n in news
join img in newsImages on n.NewsGuid equals img.NewsGuid into table1
from img in table1.DefaultIfEmpty()
select new NewsClass { NewsDetails = n, NewsImage = img };
从这里我被困住了...... 子查询上的“select top 1”,如何实现这个
越来越好... 现在我做了这样的事情:
var newsImages = db.NewsImages.OrderBy(n => n.NewsGuid).OrderBy(n => n.FileOrder).Where(n => n.FileOrder == 10);
var allNews = db.News.OrderByDescending(n => n.NewsDate).Take(sqlTop);
if (validDate)
allNews = allNews.Where(n => n.NewsDate.Year == newsDate.Year && n.NewsDate.Month == newsDate.Month && n.NewsDate.Day == newsDate.Day);
现在我需要将“newsImages”和“allNews”这两个对象合并到一个列表“newsList”中。
如何将查询 allNews 和 newsImages 的两个列表合并到一个列表中,如下所示:
select new NewsList
{
NewsGuid = n.NewsGuid,
Heading = n.Heading,
FileName = ni.FileName
}).Take(sqlTop).ToList<NewsList>();
【问题讨论】:
-
您是否创建了实体?设置你的 DbContext?这类信息属于问题。
-
Entity Framework 的全部意义在于您不再需要使用原始 SQL!不要尝试复制这种 1:1 - 使用实体框架方法 - 使用从数据库返回的对象及其导航属性!
-
@marc_s thx,这就是我发布这个的原因,以避免经典的方式进入 EF 方式,但我坚持如何处理这个特定的任务。
-
查看我的回复 - 可以作为一个起点 - 如果您可以从原始 SQL 中解放出来,您应该会向您展示作为开发人员所获得的好处和巨大的生产力提升 ....
-
EF 的这种方法比我原来的传统方法更快吗?
标签: c# entity-framework asp.net-mvc-5