【问题标题】:LINQ to Entities does not recognize the method 'System.String ToString()'LINQ to Entities 无法识别方法“System.String ToString()”
【发布时间】:2012-05-17 18:28:19
【问题描述】:

我正在尝试构建一个 Linq to Entities 查询,该查询将一个表与字符串的外键列连接起来,并且相关的表 ID 具有一个整数 ID。我知道,我知道,设计数据库架构的人搞砸了,但不幸的是,无论出于何种原因,在这种情况下我都无法更改数据库架构。

这是我得到的错误:

LINQ to Entities 无法识别方法 'System.String ToString()' 方法,并且该方法无法转换为存储表达式。

这是导致它的 linq (to Entities) 语句:

var query = from p in db.QBPOes
            join j in db.tblJobManagements on p.CustJob equals j.JobID
            join s in db.tblSuppliers on p.VendorID equals s.SupplierID.ToString()
            where p.ID == poID
            select new 
            {
                p.ID,
                p.Date,
                p.VendorID,
                p.FirstName,
                p.LastName,
                s.SupplierWorkPhone,
                s.SupplierFaxNumber,
                p.CompanyName,
            };

我加入这些表格是因为我想获得供应商的电话和传真号码。任何帮助将不胜感激。

【问题讨论】:

    标签: c#-4.0 entity-framework-4 linq-to-entities


    【解决方案1】:

    为了将 p.VendorID 转换为 integer,您可以使用此解决方法。生成的 SQL 可能不漂亮,但它应该可以工作,除非 p.VendorID 不能强制转换为整数

    var query = from p in db.QBPOes
                let vendorId = db.QBPOes.Select(x => p.VendorID).Cast<int>().FirstOrDefault()
                join j in db.tblJobManagements on p.CustJob equals j.JobID
                join s in db.tblSuppliers on vendorId equals s.SupplierID
                where p.ID == poID
                select new 
                {
                    p.ID,
                    p.Date,
                    p.VendorID,
                    p.FirstName,
                    p.LastName,
                    s.SupplierWorkPhone,
                    s.SupplierFaxNumber,
                    p.CompanyName,
                };
    

    将 s.SupplierID 转换为字符串可能会更好,因此您可以像这样重新排列查询

    var query = from s in db.tblSuppliers
                let supplierID = db.tblSuppliers.Select(x => s.SupplierID).Cast<string>().FirstOrDefault()
                join p in db.QBPOes on supplierID equals p.VendorID
                join j in db.tblJobManagements on p.CustJob equals j.JobID
                where p.ID == poID
                select new 
                {
                  p.ID,
                  p.Date,
                  p.VendorID,
                  p.FirstName,
                  p.LastName,
                  s.SupplierWorkPhone,
                  s.SupplierFaxNumber,
                  p.CompanyName,
                };
    

    【讨论】:

    • +1 用于指出两个备选方案,其中一个可能有更好的执行计划。
    • 谢谢阿杜奇!我尝试了您的第一个解决方案,效果很好。
    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2014-12-26
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多