在Entity Framework中使用存储的查询

cag*_*gin 0 asp.net entity-framework-4 c#-4.0

我想在Entity Framework中使用SQL查询.

这是我的代码:

 string sql = (@"SELECT G.GainId,
                (SELECT Name FROM Carrier WHERE CarrierId = G.CarrierId) AS Carrier,
                (SELECT Name + ' ' + Surname FROM [User] WHERE UserId = G.GainerId) AS Gainer,
                (SELECT Name + ' ' + Surname FROM [User] WHERE UserId = G.GiverId) AS Giver,
                (SELECT Name + ' ' + Surname FROM [User] WHERE UserId = G.CustomerId) AS Customer,
                    P.Name,
                    G.Gained,
                    G.Paid
                    FROM Gain AS G 
                    INNER JOIN Product AS P ON P.ProductId = G.ProductId");

            DataTable tbl = _context.Database.SqlQuery<DataTable>(sql) as DataTable;
Run Code Online (Sandbox Code Playgroud)

但是tbl没有.你有什么建议吗?我是Entity Framework的新手.

Mik*_*oud 5

那是因为SqlQuery并不意味着要回归DataTable.它的建成,来回报您的实体类型为IEnumerable<T>这里T是你的实体类型.使用下面的语句并记住它是一个可返回的可枚举类型.现在用它来执行你需要的东西.

var tbl = _context.Database.SqlQuery<{your entity type}>(sql)
Run Code Online (Sandbox Code Playgroud)

编辑

是的,事实上你可以很容易地构建这种类型.事实上,因为查询似乎是如此孤立,所以你可以在它执行的类中构建一个私有类,以便我将如何构建示例.但是,这是你需要决定的事情.下面我将为您提供课程模板.这两个属性??我不确切知道它们与哪种类型相关联,所以你需要插入它们.

private class QueryResult
{
    public int GainId { get; set; }
    public string Carrier { get; set; }
    public string Gainer { get; set; }
    public string Giver { get; set; }
    public string Customer { get; set; }
    public string Name { get; set; }
    public ?? Gained { get; set; }
    public ?? Paid { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样发表声明......

var tbl = _context.Database.SqlQuery<QueryResult>(sql)
Run Code Online (Sandbox Code Playgroud)