Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 无法强制转换类型为';System.Linq.Expressions.FieldExpression';_Entity Framework_Linq To Entities - Fatal编程技术网

Entity framework 无法强制转换类型为';System.Linq.Expressions.FieldExpression';

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

我在应用程序中使用Linq to实体,如下所示:

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