【问题标题】:Using stored query in Entity Framework在实体框架中使用存储查询
【发布时间】:2012-08-06 19:57:12
【问题描述】:

我想在实体框架中使用 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;

tbl 为空。你有什么建议吗?我是实体框架的新手。

【问题讨论】:

    标签: asp.net c#-4.0 entity-framework-4


    【解决方案1】:

    这是因为SqlQuery 并不意味着返回DataTable。它旨在将您的实体类型作为IEnumerable&lt;T&gt; 返回,其中T 是您的实体类型。使用下面的语句并记住它是一个被返回的可枚举类型。现在用它来执行您需要的操作。

    var tbl = _context.Database.SqlQuery<{your entity type}>(sql)
    

    已编辑

    是的,事实上你可以很容易地构建这种类型。事实上,由于查询看起来如此孤立,您可能可以在执行它的类中构建一个私有类,以便我将如何构建示例。但是,这是您需要决定的事情。下面我将给你一个类的模板。 ?? 的两个属性我不确切知道它们与什么类型相关,因此您需要将它们插入。

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

    然后发出这样的声明……

    var tbl = _context.Database.SqlQuery<QueryResult>(sql)
    

    【讨论】:

    • 感谢您的回答,迈克。我从我的 sql 查询中的几个表中选择值。所以我没有具有结果数据属性的实体类型。这就是我想使用 DataTable 的原因。您还有什么建议吗?
    • 我在考虑。现在我确信这是解决我的问题的一种方法。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多