LINQ有条件地使用不同的字段来加入

时间:2018-08-13 20:45:21

标签: c# entity-framework linq

我有这种情况:

Table A 
Field A  Field B
   d       1 
   d       2
   d       3
Table B 
Field A  Field B
   d       1
   d       2
   d       3
   d       4

我希望表B中的“ 4”与表A中的“ 3”匹配。
这是我的当前代码:

short maxFieldB = DatabaseContext.TableA
    .OrderByDescending(x => x.FieldB)
    .Select(s => s.FieldB)
    .First();

IQueryable<FieldXType> fieldX = (from tableb in DatabaseContext.TableB
    join tablea in DatabaseContext.TableA on new 
    {
        a = tablea.FieldA,
        b = tablea.FieldB
    }
    equals new
    {
        a = tableb.FieldA,
        b = (tableb.FieldB > maxFieldB ? maxFieldB : tableb.FieldB)
    })
    .ToList();

运行此命令时,出现异常“参数类型不匹配”。堆栈跟踪似乎指向我的包含三元运算符的语句。

(at System.Linq.Expressions.Expression.Condition(Expression test, 
Expression ifTrue, Expression ifFalse))  

我认为我所做的等同于T-SQL CASE语句。我要解决这个错误吗?如果是这样,如何使“表B”上的“ 4”与“表A”上的“ 3”匹配?与我从Lambda语法切换到中间的查询语法有什么关系?

谢谢。

1 个答案:

答案 0 :(得分:0)

据我所知,您有两个表,并且希望在多个条件下将它们连接在一起。 错误是正确的"Argument types do not match". 以下是与代码有关的几个问题:

IQueryable<FieldXType> fieldX = (from tableb in DatabaseContext.TableB
        join tablea in DatabaseContext.TableA on new Eaxmple1 //add a type name that contains defination for a and b
        {
            a = tablea.FieldA,
            b = tablea.FieldB//This is of some type say FieldB(as defined in your Model Eaxmple1)
        }
        equals new Eaxmple1 
        {
            a = tableb.FieldA,
            b = (tableb.FieldB > maxFieldB ? maxFieldB : tableb.FieldB) //and this maxFieldB is of another type 'short' as you defined above.
        } select tablea).ToList();

您的查询也缺少select语句,从而解决了该问题。

以下一些快速修复可能会有所帮助:

创建一个新模型,其中包含ab的定义(如果尚未创建),并确保它们的类型与表的类型相同。 例如

public class Eaxmple1
{
public field a {get;set;}
public field b {get;set;}
}

如果您可以提供表格的更多详细信息,我会更好地帮助您。