3

使用 MVC3 VS2010 和 SQL Server 2008 Express 我正在尝试基于两个 SQL Server 表进行过滤并显示结果。一张表是客户表,另一张是代理表。它们在客户表中具有共同的 ClientAgentID 和在代理表中的 ID。代理记录并且应该能够看到分配给代理的客户端。如果您对执行此操作的最佳方法有任何想法,请帮助我。到目前为止,我正在尝试在客户端控制器中进行过滤,这就是我所拥有的,但我得到的消息是在标题中。

 public ActionResult Index()
    {
        //This displays all the clients not filtered by the Agent ID number
        //var clientItems = db.MVCInternetApplicationPkg;
        //return View(clientItems.ToList());

        //Trying to filter by the agent name given in the login page then finding 
        //the agent ID

        var getAgentID = from a in db.AgentsPkg
                            where a.AgentLogin == User.Identity.Name
                            select a.ID;

        var clientItems = from r in db.MVCInternetApplicationPkg
                          where Convert.ToString(r.ClientAgentID)
                                == Convert.ToString(getAgentID)
                          select r;
        //THIS IS THE LINE OF CODE THAT SHOWS THE ERROR MESSAGE
        return View(clientItems.ToList());
    }

这是我在 Music Store 之后的第一个 MVC 项目,所以愿意学习并接受任何帮助或建议。干杯

这是我最终使用的解决方案。如果这是一个好方法,任何反馈将不胜感激

 public ActionResult Index()
    {

        var innerJoint = from agents in db.AgentsPkg where agents.AgentLogin == User.Identity.Name
                         join clients in db.MVCInternetApplicationPkg on agents.ID equals clients.ClientAgentID
                         select clients;

        return View(innerJoint.ToList());
    }
4

5 回答 5

3

您不想在 linq 语句中使用 Convert !!!!!!

 string clientagentid=Convert.ToString(r.ClientAgentID);
    string getagentid= Convert.ToString(getAgentID);

var clientItems = (from r in db.MVCInternetApplicationPkg
                          where clientagentid==getagentid
                          select r).ToList();
 return View(clientItems);
于 2012-08-22T05:18:31.240 回答
2

一、错误原因:

正如其他人所说,这是由于Convert.ToString()在您的where子句中使用了,Linq 无法将其转换为 SQL。我希望您的原始查询仅通过删除这两个Convert.ToString()函数即可工作。

2.“....最好的方法”:

好吧,更好的方法.... :)

在 Entity Framework 中,在相关实体之间导航的简单方法是通过Navigation Properties。如果您的方法是“数据库优先”,则应在您的 EDMX 中为您生成这些。如果您的方法是“代码优先”,这里有一篇很好的文章描述了如何设置它。

无论哪种方式,我都希望你的Client类有一个导航属性Agent(即类似于Order你提到的 MvcMusicStore 示例中的 OrderDetail 属性):

public virtual Agents Agent { get; set; }

然后您的方法变得非常简单(即类似于 MvcMusicStore 中的许多控制器方法)...不需要Joins或需要多个语句:

var clients = db.MVCInternetApplicationPkg.Where(c => c.Agent.AgentLogin == User.Identity.Name); 
return View(clients.ToList()); 
于 2012-08-22T05:39:02.553 回答
2

答案是使用SqlFunctions.StringConvert(使用 'decimal' 或 'double' 但 'int' 不起作用)见示例

using System.Data.Objects.SqlClient ;

var clientItems = from r in db.MVCInternetApplicationPkg
                      where SqlFunctions.StringConvert((double ), r.ClientAgentID)
                            == SqlFunctions.StringConvert((decimal) , getAgentID)
                      select r;

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/dd466166.aspx

于 2014-04-29T22:41:43.237 回答
1

发生的事情是 Linq 提供程序(Linq to Entities)正在尝试将您的查询转换为 SQL,并且没有用于 Convert 的映射。这些错误有时难以解读,但线索在“String.ToString()”行中。还要意识到,由于延迟执行,错误不会出现,直到clientItems迭代,在你的情况下调用toList()inreturn View(clientItems.ToList());

于 2012-08-22T05:31:33.017 回答
0

LINQ 无法将 Convert.ToInt32() 映射到等效的 T-SQL 中,因此会引发异常。正如 COLD TOLD 所说,您必须转换值,然后在查询中使用转换后的值。

请检查:为什么 LINQ to Entities 不能识别某些方法?

于 2012-08-22T05:36:40.493 回答