尝试解析列以进行不等式比较时,LINQ to Entities 无法识别“Int32 Parse(System.String)”方法

问题描述 投票:0回答:7

我的页面中有以下代码:

var myVar= Entity.SetName
                 .Where(p => int.Parse(p.ID) >= start &&
                  int.Parse(p.ID) <= end);

start 和 end 是 int,但 p.ID 是字符串。所以我应该将 p.ID 转换为 int。但我收到以下错误:

LINQ to Entities 无法识别方法“Int32” Parse(System.String)'方法,并且该方法无法翻译 到存储表达式中。

问题出在哪里??

c# entity-framework
7个回答
24
投票

首先,我强烈建议检查您的数据库设计,是否有充分的理由让

ID
成为
string
。我会考虑将
ID
数据库类型更改为
int
,您将通过转换
摆脱这个问题。

您收到的错误意味着 EF 不知道如何将方法

Int32.Parse()
转换为 SQL。 基本上你有两种选择来处理这个问题:

在实体实体之外进行比较:

var myVar= Entity.SetName.AsEnumerable()
                 .Where(p => int.Parse(p.ID) >= start &&
                  int.Parse(p.ID) <= end);

但是这是不推荐,因为在应用

where
条件之前,您正在从数据库读取整个结果集。

或者创建自定义模型定义函数,如这篇文章中所述:

在 EF 4.0 中将字符串转换为 Int 或者 实体框架:在哪里扩展 CSDL/MSL?


4
投票

首先尝试转换为

int
然后传递该变量名称

int catgry = Convert.ToInt32(customercategory.OWNERSHIP_TYPE);
var customerCateg = (from d in _db.tbl_SIL_CUSTOMER_CATEGORY_MST
    .Where(d => d.CAT_ID == catgry) select d.CAT_TYPE).SingleOrDefault();

0
投票
private void LoadDetail(int id)
    {
        var sp = from category in db.ProductCategories
                 join product in db.Products on category.ProductCategoryID equals product.ProductCategoryID
                 where id == int.Parse(category.ProductCategoryID)
                 select new
                 {
                     product.ProductID,
                     product.ProductName,
                     product.ProductCode,
                     product.Deception,
                     category.CategoryName,
                     product.Quanrity,
                     product.Price
                 };
        DGVDetail.DataSource = sp.ToList();//help: Error: LINQ to Entities does not recognize the method 'Int32 Parse(System.String)' method, and this method cannot be translated into a store expression
    }

    private void DGVMaster_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        int index = e.RowIndex;
        LoadDetail(index + 1);
    } 

0
投票

要将 string 转换为 int,你必须将其设为可枚举,然后你可以进行排序或任何你喜欢的操作

  var list = db.UserEntriesTable.AsEnumerable().Select(x => new {

             Name = x.Name,

             Roll = Convert.ToInt32(x.Roll),

             Mobile = x.Mobile

        }).OrderBy(x => x.Roll).ToList();

0
投票
int nb = EE.Stagaire.Join(EE.Filiere, S => S.IdFiliere, F => F.IdFiliere, (S, F) => new
        {
            ID = S.Id,
            Name = S.Nom,
            Prénon = S.Prenon,
            Email = S.Email,
            MoteDePass = S.MoteDePass,
            Filiere = F.Filiere1,
        }).Where(S => S.ID.ToString() == r.ToString()).Take(1).Count();
        if (nb != 0)
        {
            MessageBox.Show("find it");

        }

//如果你必须数据类型是整数,你可以这样做


0
投票

虽然我确信最初的答案是当时最好的答案,但它已经很旧了。正如该答案中所述,问题是实体框架不支持

int.Parse()
的翻译。但是,它确实支持
Convert.ToInt32()
,可以按照 here 的建议使用它。

更改示例代码:

var myVar= Entity.SetName
                 .Where(p => int.Parse(p.ID) >= start &&
                  int.Parse(p.ID) <= end);

对此:

var myVar= Entity.SetName
                 .Where(p => Convert.ToInt32(p.ID) >= start &&
                  Convert.ToInt32(p.ID) <= end);

应该生成正确的 T-SQL,没有任何错误。

请注意,并非所有实体框架版本都支持此功能。通过快速搜索,我无法找到有关何时首次引入此功能的任何信息,但确实知道类似类型的转换在不同版本之间(尤其是跨 EF 和 EF Core)需要如何实现方面有所不同。

这可能应该是对已接受答案的评论,但我无法做出这些评论,尽管它已经很老了,但它仍然作为谷歌的最佳结果出现,所以我把它放在这里以防它对某人有帮助其他遇到类似的问题。


-1
投票

虽然效率不高,但您应该能够加载所有行,然后使用 LINQ to Objects:

var myVar= Entity.SetName.ToList()
                 .Where(p => int.Parse(p.ID) >= start &&
                  int.Parse(p.ID) <= end);
© www.soinside.com 2019 - 2024. All rights reserved.