我正在编写一个RESTful web服务,用于使用ASP.NET MVC4和实体框架访问Azure SQL中的数据。
我为一个名为QuizFamilies的表创建了一个控制器,VS生成了常见的REST疑似对象: GetQuizFamilies、PutQuizFamilies等。
但是,我想定义我自己的SQL,它将只返回特定的列和行。
例如,在GetQuizFamilies方法中,我希望指定以下内容:
SELECT QuizFamilies.ID, QuizFamilies.Title, ImageData.Uri
FROM QuizFamilies
LEFT OUTER JOIN Images ON QuizFamilies.ImagesID = Images.ID
LEFT OUTER JOIN ImageData on Images.ImageDataID = ImageData.ID我该怎么做呢?
发布于 2013-06-10 10:54:27
使用EF,可以通过GroupJoin执行左外部连接。有关joins的更多信息,请访问http://msdn.microsoft.com/en-us/library/bb896266.aspx。这是另一个可能有帮助的例子。http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx。至于投影,可以使用匿名类型来执行,例如
select new { Amount = 108, Message = "Hello" }您的查询可能如下所示
var query = from qf in context.QuizFamilies
join images in context.Images on qf.ImagesID = images.ID into quizImages
join imageData in context.ImageData on images.ImageDataID = imageData.ID into imgdata
from images in quizImages.DefaultIfEmpty()
from imageData in imgdata.DefaultIfEmpty()
select new { Id = qf.ID, Title = qf.Title, Uri = imageData.Uri};更新
如果想要更改默认的Get实现,只需删除代码并更新方法签名即可。你不能返回匿名类型,所以如果你仍然只想要这3个字段,你需要一个额外的类。我个人会保留默认的Get方法,并添加另一个方法
public class QuizFamilyTitleAndUri
{
public String Id {get; set;}
public String Title {get; set;}
public Uri ImageUri {get; set;}
}
public IEnumerable<QuizFamilyTitleAndUri> GetQuizFamilies()
{
return var query = from qf in db.QuizFamilies
join images in db.Images on qf.ImagesID = images.ID into quizImages
join imageData in db.ImageData on images.ImageDataID = imageData.ID into imgdata
from images in quizImages.DefaultIfEmpty()
from imageData in imgdata.DefaultIfEmpty()
select new QuizFamilyTitleAndUri() { Id = qf.ID, Title = qf.Title, ImageUri = imageData.Uri};
}https://stackoverflow.com/questions/17016069
复制相似问题