如何将自己的SQL插入ASP.NET MVC 4控制器方法?

时间:2013-06-10 02:15:22

标签: asp.net-mvc-4 entity-framework-5

我正在编写一个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

我该怎么做?

1 个答案:

答案 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};

}