我正在编写一个RESTful Web服务,用于使用ASP.NET MVC 4和Entity Framework访问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
我该怎么做?
答案 0 :(得分:3)
使用EF,可以通过GroupJoin执行左外连接。有关联接的更多信息,请访问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};
}