无法将类型为'System.Linq.Expressions.FieldExpression'的对象转换

3

我在我的应用程序中使用 LinqKit.dll 来执行Linq To Entity操作,示例如下:

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());
            };

我遇到了错误:

System.InvalidCastException: 无法将类型为“System.Linq.Expressions.FieldExpression”的对象强制转换为类型“System.Linq.Expressions.LambdaExpression”。

但是,如果删除isInCategory(x.CategoryID,category.CategoryID),应用程序就可以正常运行。

请问你能帮我吗?


简短回答:无法实现。因为您的方法无法转换为SQL。通常的做法是使用SQL函数并将其映射到应用程序,但这仅在使用EDMX进行映射时才可能。 - Ladislav Mrnka
似乎有些奇怪,但是通过使用工作单元模式,我的应用程序现在可以正常工作了。 - Babak Fakhriloo
1
从你的问题中我不能确定这是否是情况(这就是为什么这不是一个答案),但如果 isInCategory 不是一个本地变量,那么你会得到那个错误。如果它不是,那么在 qry 行之前添加一行代码,比如说 var expression = isInCategory;,然后在 qry 行中使用 expression - DCShannon
1个回答

1

好的,在查看评论中的代码后,我可以建议以下操作: 将文章中的string CategoryID替换为public virtual ICollection<Category> 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();

有没有相关的示例代码? - Babak Fakhriloo
据我理解你的isInCategory方法,你通过将它们列在item.CategoryID中并用逗号分隔来将类别与项目关联起来。如果你不想改变架构,那么你可以用简单的x.CategoryID.Contains(category.CategoryID)替换isInCategory。这应该几乎可以达到相同的效果。个人而言,我更喜欢通过外键来维护项目与类别之间的关联。 - Vladimir Perevalov
而这个字符串是问题的原因。 - Vladimir Perevalov
即使使用 x.CategoryID.Contains(category.CategoryID)(如果我不想改变架构),也无法正常工作,并且会出现“LINQ to Entities不识别方法'System.String ToString()'方法,因此无法将此方法翻译成存储表达式”的错误。 - Babak Fakhriloo
你能发布一下你的表结构和具体使用的查询吗?.Contains()应该可以工作。既然它抱怨ToString(),那么你仍然在某个地方使用它。 - Vladimir Perevalov
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接