我的页面中有以下代码:
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)'方法,并且该方法无法翻译 到存储表达式中。
问题出在哪里??
首先,我强烈建议检查您的数据库设计,是否有充分的理由让
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
条件之前,您正在从数据库读取整个结果集。
或者创建自定义模型定义函数,如这篇文章中所述:
首先尝试转换为
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();
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);
}
要将 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();
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");
}
//如果你必须数据类型是整数,你可以这样做
虽然我确信最初的答案是当时最好的答案,但它已经很旧了。正如该答案中所述,问题是实体框架不支持
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)需要如何实现方面有所不同。
这可能应该是对已接受答案的评论,但我无法做出这些评论,尽管它已经很老了,但它仍然作为谷歌的最佳结果出现,所以我把它放在这里以防它对某人有帮助其他遇到类似的问题。
虽然效率不高,但您应该能够加载所有行,然后使用 LINQ to Objects:
var myVar= Entity.SetName.ToList()
.Where(p => int.Parse(p.ID) >= start &&
int.Parse(p.ID) <= end);