【问题标题】:join diffrent field type in linq在 linq 中加入不同的字段类型
【发布时间】:2013-04-15 06:29:51
【问题描述】:

在 linq 中加入不同的字段类型

public partial class Product
{
    public int ID { get; set; }

    public string CategoryID
    {
        get { return Myclass.increse(CategoryID); }
        set { CategoryID = value; }
    }
    public string Name { get; set; }

}

public partial class ProductCategory
{
    public int ID { get; set; }
    public string Name { get; set; }
}
var query = (from c in dContext.ProductCategories
                    join p in dContext.Products
                     on Myclass.EncodeMD5(c.ID.ToString()) equals p.CategoryID
                    select new { id = p.ID, cat = p.CategoryID, name = p.Name, cat1 = c.Name }
                  ).ToList();

该字段应转换为字符串 然后函数运行EncodeMD5

错误:

LINQ to Entities 无法识别方法 'System.String EncodeMD5(System.String)' 方法,这个方法不能翻译 进入商店表达式。

【问题讨论】:

  • 现在有什么问题......?
  • 您确定该示例符合该错误消息吗?在该示例中,LINQ 可以看到 EncodeMD5 方法和 CategoryID 属性(我希望它会抱怨这两者),但您没有显示它 increse
  • 已更正 LINQ to Entities 无法识别方法 'System.String EncodeMD5(System.String)' 方法,并且此方法无法转换为存储表达式。

标签: c# linq c#-4.0 entity-framework-4 entity-framework-4.1


【解决方案1】:

您不能在 LINQ-to-(某些数据库后端)中调用任意 .NET 方法 - EF(等)的全部意义在于它想要从您的表达式创建 SQL - 涉及where 子句的东西。它可以使用简单的属性和运算符,以及一些它知道并可以映射到 SQL 的方法,但它不能执行它从未听说过的事情(increseEncodeMD5 等)它怎么知道SQL要写吗?

对于像 MD5 这样的东西,最好的办法是将 MD5 哈希值与 ID 一起存储在基础表中CategoryID 的“增加”(不管是什么)也是如此。因此,您的查询最终会处理这些预先计算的值:

on c.IDHash equals p.CategoryIDHash

【讨论】:

    猜你喜欢
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多