相关疑难解决方法(0)

LINQ,无法创建XXX类型的常量值.在此上下文中仅支持基元类型或枚举类型

在我的应用程序中,我有讲师,他们有可以教授的课程列表,当我删除课程时,我想删除与讲师的联系.这是代码:

public void RemoveCourse(int courseId)
{
    using (var db = new AcademicTimetableDbContext())
    {
        var courseFromDb = db.Courses.Find(courseId);

        var toRemove = db.Lecturers
                        .Where(l => l.Courses.Contains(courseFromDb)).ToList();

        foreach (var lecturer in toRemove)
        {
            lecturer.Courses.Remove(courseFromDb);
        }

        db.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我明白了

NotSupportedException:无法创建类型的常量值Course.在此上下文中仅支持基元类型或枚举类型.

我究竟做错了什么?

c# linq entity-framework

62
推荐指数
2
解决办法
7万
查看次数

组合多个 Linq 表达式

我正在重构一些代码,试图使其更具自我记录性。当前代码对 OData 服务进行了查询,如下所示:

return context.MessageLog.Where
(
    x => 
    (
        x.Status == MessageStatus.Success 
        || x.Status == MessageStatus.Failure
    ) 
    && x.Direction == MessageDirection.Inbound 
    && x.ResponseDate == new DateTimeOffset(new DateTime(1900, 01, 01))
);
Run Code Online (Sandbox Code Playgroud)

我希望改变这一点以利用 Linq 表达式。
我可以将所有逻辑移动到单个表达式中并运行代码context.MessageLog.Where(MessageIsPendingResponse);。但是,我想为不同的条件创建表达式:(MessageIsProcessed即现在处于成功或失败状态)MessageIsInboundResponseNotYetSent(响应日期为空)。我可以将这些与多个 where 语句结合起来,如下所示:

return context.MessageLog
    .Where(MessageLogExpression.MessageIsProcessed)
    .Where(MessageLogExpression.MessageIsInbound)
    .Where(MessageLogExpression.ResponseNotYetSent);
Run Code Online (Sandbox Code Playgroud)

MessageLogExpression作为我用来包含这些预定义表达式的类)。

问题 1

这是组合语句的最佳方式,还是先过滤错误字段的风险(例如,Linq 是否将所有条件组合成单个查询并允许查询引擎(在 SQL 术语中)确定最佳执行计划;或我们是否强制它首先过滤状态字段?

问题2

以上对于我们AND加入表达式的场景非常有用;但是我们怎么做OR呢?我认为有一些方法可以将这些结合起来,但找不到任何明显的东西。我怀疑这样的事情存在吗?

return context.MessageLog.Where(new OrExpression(MessageIsSuccess,MessageIsFailure));
Run Code Online (Sandbox Code Playgroud)

问题 3

是否有一种在另一个表达式定义中组合表达式的好方法;例如像下面的代码(只有一个编译版本)?

public static Expression<Func<MessageLogRecord, bool>> MessageIsPendingResponse
{
    get
    {
        Expression<Func<MessageLogRecord, bool>> …
Run Code Online (Sandbox Code Playgroud)

c# linq linq-expressions odata

4
推荐指数
1
解决办法
1746
查看次数

标签 统计

c# ×2

linq ×2

entity-framework ×1

linq-expressions ×1

odata ×1