【发布时间】:2017-11-08 10:41:59
【问题描述】:
因为我是 Linq 和实体框架的新手。
以下是我的工作存储过程,其中包含一个逗号分隔字符串的值(SUBSTRING 子句)
SELECT DISTINCT
SR.StudentRequestId,
SR.RegistrationId,
SR.Location,
SR.PaymentMethod,
SR.CreatedOn,
C.ClassName,
CC.CampusName,
CASE WHEN ISNULL(TSR.StatusId,0)=0 THEN 1 ELSE TSR.StatusId END AS StatusId,
SUBSTRING(
(SELECT', ' + REPLACE(REPLACE(ST1.FromTime,'AM',''),'PM','') + '-'+ ST1.ToTime AS [text()]
FROM dbo.StudentRequestTimings ST1
WHERE ST1.StudentRequestId = SRT.StudentRequestId
ORDER BY ST1.CreatedOn FOR XML PATH ('')
), 2, 1000) [Time] FROM StudentRequest SR
INNER JOIN Registration R ON R.RegistrationId = SR.RegistrationId
INNER JOIN Campus CC ON CC.CampusId = R.CampusId
INNER JOIN Class C ON C.ClassId = SR.ClassId
LEFT JOIN TutorClasses TC ON SR.ClassId = TC.ClassId
LEFT JOIN StudentRequestTimings SRT ON SR.StudentRequestId = SRT.StudentRequestId
LEFT JOIN TutorStudentRequest TSR ON TSR.StudentRequestId = SRT.StudentRequestId AND TutorId = @RegistrationId
WHERE TC.RegistrationId = @RegistrationId
ORDER BY SR.CreatedOn DESC
我需要在接受IQueryable<T> 的PagedList 方法中使用此数据,并且我想将此SP 转换为返回IQueryable 的LINQ 查询(内部PagedList 方法使用@987654327 @ 和 .Take() 执行服务器端分页)。
以下是我迄今为止的尝试,但我不知道为什么我没有从 SQL 查询中获得预期的结果。我认为下面的代码有问题。任何人都可以找出以下代码中的问题吗?
var model = (from sr in db.StudentRequests
join r in db.Registrations on sr.RegistrationId equals r.RegistrationId
join cc in db.Campus on r.CampusId equals cc.CampusId
join c in db.Classes on sr.ClassId equals c.ClassId
from tc in db.TutorClasses.Where(t => t.ClassId == sr.ClassId).DefaultIfEmpty()
from srt in db.StudentRequestTimings.Where(s => s.StudentRequestId == sr.StudentRequestId).DefaultIfEmpty()
from tsr in db.TutorStudentRequests.Where(t => t.StudentRequestId == srt.StudentRequestId && t.TutorId == registrationid).DefaultIfEmpty()
where tc.RegistrationId == registrationid
select new TutorDashboard
{
StudentRequestId = sr.StudentRequestId,
RegistrationId = sr.RegistrationId,
Location = sr.Location,
PaymentMethod = sr.PaymentMethod,
CreatedOn = sr.CreatedOn,
ClassName = c.ClassName,
CampusName = cc.CampusName,
Time = string.Join(",", db.StudentRequestTimings.Where(p => p.StudentRequestId == sr.StudentRequestId).Select(p => p.FromTime.ToString().Replace("AM", "").Replace("PM", "") + "-" + p.ToTime.ToString())),
}).Distinct();
谁能帮我解释一下为什么我没有从上面的 linq 查询中得到正确的结果?
问题是在向 Linq 添加以下代码时我遇到了问题,我该如何解决这个问题
Time = string.Join(",", db.StudentRequestTimings.Where(p => p.StudentRequestId == sr.StudentRequestId).Select(p => p.FromTime.ToString().Replace("AM", "").Replace("PM", "") + "-" + p.ToTime.ToString())),
我添加了这段代码,因为我想从多行中获取单个字符串
1:00-1:30 PM, 2:00=2:30 PM
5:00-5:30 PM
同样明智
【问题讨论】:
-
LINQ 不能替代 SQL。它是 ORM 的一种语言。您的实体应该有关系和映射,而不是连接。除了
db.StudentRequests.Where(sr=>sr.RegistrationID == registrationId).Select(...),你不应该写任何东西 -
另一方面,您不需要 LINQ 对查询结果进行分页。在数据库中创建视图或函数,将 that 映射到
TutorDashboard实体并使用 LINQ 查询该实体 -
我想我会更好地检查你
sql Profile然后获取 GeneratedT-Sql并将其复制并粘贴到Management Studio然后运行它,检查条件并加入以知道为什么不'不返回任何值 -
@PanagiotisKanavos 实际上我想在视图侧返回模型,所以我将它与 TutorDashboard 绑定
-
@Xtremcool 不会改变任何东西。将查询转换为视图(没有 distinct/order by),为其创建实体并将实体映射到视图。类似的问题还有很多
标签: c# sql-server entity-framework linq