2010-11-03 123 views
0

所以我试图解决我的Silverlight报告应用程序中缺乏存储过程支持,并且我的linq有点麻烦。实体框架/ linq查询问题

我有一个存储过程,看起来像这样:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author: Some Dev Guy 
-- Create date: 11/02/10 
-- ============================================= 
Alter PROCEDURE spGetTopReferers 
@p_sitekey SmallInt, 
@p_startDate SmallDateTime, 
@p_endDate SmallDateTime 
AS 
BEGIN 

SET NOCOUNT ON; 

SELECT 
    TOP 10 
    SUM(DaySummaryReferrers.Visits) AS Visits, 
    SUM(DaySummaryReferrers.NewVisitors) AS 'New Visitors', 
    SUM(DaySummaryReferrers.Prospects) AS Prospects, 
    SUM(DaySummaryReferrers.Customers) AS Customers, 
    Referrers.Referrer 
    FROM 
    DaySummaryReferrers 
    LEFT OUTER JOIN 
    Referrers 
    ON 
    DaySummaryReferrers.ReferrerID = Referrers.ReferrerID 
    Where 
    DaySummaryReferrers.SiteKey = @p_sitekey 
    AND 
    DaySummaryReferrers.Dated 
    Between 
    @p_startDate 
    AND 
    @p_endDate 
    GROUP BY 
    Referrers.Referrer 
    ORDER BY 
    Visits DESC; 
END 
GO 

我已经创建了如下的DomainService类,这样我可以使用实体框架查询这一天。我想我的查询的结果推到我的自定义数据结构监守我没有说有,我需要为我的报告中所有信息的实体(特别是访问和引用)

namespace Reports.Web.Services 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.ComponentModel.DataAnnotations; 
    using System.Linq; 
    using System.ServiceModel.DomainServices.Hosting; 
    using System.ServiceModel.DomainServices.Server; 
    using System.Data; 
    using System.Data.Objects; 

    public class TopReferers 
    { 
     [Key] 
     [Editable(false)] 
     public int reffererID { get; set; } 
     public int? Visits { get; set; } 
     public int? Visitors { get; set; } 
     public int? Prospects { get; set; } 
     public int? Customer { get; set; } 
     public String Referrer { get; set; } 

    } 

    [EnableClientAccess()] 
    public class WebReportAggregateService : DomainService 
    { 
     WhosOnV5DevEntities ctx = new WhosOnV5DevEntities(); 

     public IQueryable<TopReferers> GetTopReferrers() 
     { 

      DateTime p_start = new DateTime(2010, 01, 01); 
      DateTime p_end = new DateTime(2010, 11, 01); 

      ObjectSet<DaySummaryReferrer> myReferrers = ctx.DaySummaryReferrers; 
      ObjectSet<Referrer> myReferrerNames = ctx.Referrers; 


      IQueryable<TopReferers> x = from referrer in myReferrers.Take(10) 
             join referrerName in myReferrerNames 
             on referrer.ReferrerID 
             equals referrerName.ReferrerID 
             where 
             referrer.SiteKey == 74 
             && 
             referrer.Dated >= p_start 
             && 
             referrer.Dated <= p_end 
             group referrer by referrerName.Referrer1 into g 
             select new TopReferers { Visits = g.Key.Visits, Customer = g.Key.Customers, Prospects = g.Key.Prospects, Visitors = g.Key.NewVisitors, Referrer = g.Key.Referrer, reffererID = g.Key.ReferrerID }; 


      return x; 
     } 

    } 
} 

这是我得到的错误:

select new TopReferers { Visits = g.Key.Visits, Customer = g.Key.Customers, Prospects = g.Key.Prospects, Visitors = g.Key.NewVisitors, Referrer = g.Key.Referrer, reffererID = g.Key.ReferrerID }; 

错误:

Error 2 'string' does not contain a definition for 'Customers' and no extension method 'Customers' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?) C:\Users\User\documents\visual studio 2010\Projects\Reports\Reports.Web\Services\WebReportAggregateService.cs 53 108 Reports.Web 

我得到这个错误的访问,自定义,前景,游客,referrer和ReferrerID。

任何帮助,将不胜感激= d

+3

您可以通过实际包括在你的问题的错误开始...... – 2010-11-03 17:12:46

回答

0

Referrer.Referrer1是什么类型的?从错误,这听起来像你的组密钥是string

我想你想要做的是通过组合键组:

group referrer by new { ID = referrerName.ReferrerID, Name = referrerName.Referrer1 } 

,然后选择这样的:

select new TopReferers { referrerID = g.Key.ID, 
         Visits = g.Sum(x => x.Visits), 
         Visitors = g.Sum(x => x.NewVisitors), 
         Prospects = g.Sum(x => x.Prospects), 
         Customer = g.Sum(x => x.Customers), 
         Referrer = g.Key.Name } 
+0

我的组密钥是一个字符串,从您的句子的上下文我假设组密钥需要是一个int? – BentOnCoding 2010-11-03 18:00:58

+0

@Robotsushi,no - 这会产生类似的错误,试图在'int'上调用'Customers'方法。请看我编辑的答案 - 我不完全确定ID和姓名的来源,但我认为这很接近。 – 2010-11-03 18:17:39

1

在你的类属性你有Customer单数和在LINQ你有Customers复数。

public class TopReferers 
{ 
    [Key] 
    [Editable(false)] 
    public int reffererID { get; set; } 
    public int? Visits { get; set; } 
    public int? Visitors { get; set; } 
    public int? Prospects { get; set; } 
    public int? **Customer** { get; set; } 
    public String Referrer { get; set; } 

} 
+0

为所有g.Key属性生成此错误。 错误2'字符串'不包含'Customers'的定义并且没有扩展方法'Customers'接受类型'string'的第一个参数可以找到(你是否缺少using指令或程序集引用?)C: \ Users \ User \ documents \ visual studio 2010 \ Projects \ Reports \ Reports.Web \ Services \ WebReportAggregateService.cs 53 108 Reports.Web – BentOnCoding 2010-11-03 17:42:50

+0

你试过我的解决方案吗? – 2010-11-03 18:21:49

+0

事实证明,我在myReferrers变量上使用Take(10)方法导致了一些错误。 – BentOnCoding 2010-11-03 20:27:31