Entity framework 无法强制转换类型为';System.Linq.Expressions.FieldExpression';
我在应用程序中使用Linq to实体,如下所示:Entity framework 无法强制转换类型为';System.Linq.Expressions.FieldExpression';,entity-framework,linq-to-entities,Entity Framework,Linq To Entities,我在应用程序中使用Linq to实体,如下所示: qry = _articleRepo.GetItemsByCulture(Thread.CurrentThread.CurrentCulture.Name) .AsExpandable().Where(x => x.Approved && isInCategory(x.CategoryID, category.CategoryID)); Func<st
qry = _articleRepo.GetItemsByCulture(Thread.CurrentThread.CurrentCulture.Name)
.AsExpandable().Where(x => x.Approved && isInCategory(x.CategoryID, category.CategoryID));
Func<string, int, bool> isInCategory = (x, y) =>
{
IQueryable<string> list = x.Split(',').AsQueryable();
//Except
//x.Except(_);
return list.Any(z => z == y.ToString());
};
qry=\u articleRepo.GetItemsByCulture(Thread.CurrentThread.CurrentCulture.Name)
.AsExpandable()。其中(x=>x.Approved&&isincegory(x.CategoryID,CategoryID));
函数isInCategory=(x,y)=>
{
IQueryable list=x.Split(',').AsQueryable();
//除了
//x、 除();;
返回list.Any(z=>z==y.ToString());
};
这给了我一个错误:
System.InvalidCastException:无法强制转换类型为的对象
输入'System.Linq.Expressions.FieldExpression'
'System.Linq.Expressions.LambdaExpression'
但是删除isInCategory(x.CategoryID,category.CategoryID)会导致应用程序正常运行
请帮助我好吗?好的,在查看注释中的代码后,我可以提出以下建议: 将文章中的
string CategoryID
替换为public virtual ICollection Categories{get;set;}
,这样EF将创建一个外键。然后,为了获得特定类别的文章,您可以使用类似以下代码:
var articlesInCategory = context.Articles
.Where(x => x.Language == Thread.CurrentThread.CurrentCulture.Name)
.Where(x => x.Approved && x.Categories.Any(c => c.CategoryID == c1.CategoryID)).ToList();
当您想要创建新文章时,您应该使用以下内容:
var c1 = context.Categories.OrderBy(c => c.Title).First();
var c2 = context.Categories.OrderBy(c => c.Title).Skip(1).First();
context.Articles.Add(new Article { Categories = new Collection<Category> { c1, c2 } });
context.SaveChanges();
var c1=context.Categories.OrderBy(c=>c.Title.First();
var c2=context.Categories.OrderBy(c=>c.Title).Skip(1).First();
Add(新文章{Categories=新集合{c1,c2});
SaveChanges();
是否有这方面的样本?据我所知,您的isInCategory方法。通过在item.CategoryID中列出类别并用逗号分隔,可以将类别与项目关联起来。如果您不想更改体系结构,那么可以用简单的x.CategoryID.Contains(category.CategoryID)替换isInCategory。这应该以几乎相同的方式工作。就我个人而言,我更喜欢通过外键维护项目与类别的关联。例如,您有三个表:items{ItemId,ItemData…},categories{CategoryID},itemsincegority{ItemId,CetagoryID}。这样ORM将在两个实体(item.Categories和categoty.Items)上生成列表。然后在查询中,您将能够使用如下内容:context.Items.Where(i=>i.Categories.Contains(category));通过使用isInCategory,我检查文章是否在指定的类别|(category.CategoryID)中,因为一篇文章可以有多个类别,我将其保存在一个字符串中。这个字符串是问题的原因。简短的回答:没有办法让它起作用。因为您的方法无法转换为SQL。通常的方法是使用SQL函数并将其映射到应用程序,但这只有在使用EDMX进行映射时才可能。这看起来很奇怪,但使用工作单元模式购买,我的应用程序现在工作正常。我无法从您的问题中确定是否是这种情况(这就是为什么这不是答案),但是如果isInCategory
不是局部变量,那么您将得到该错误。如果不是,则在qry
行之前添加一行,表示类似var expression=isInCategory的内容编码>然后在qry
行中使用expression
。