【问题标题】:LINQ Join ErrorsLINQ 连接错误
【发布时间】:2010-11-02 17:59:15
【问题描述】:

我收到以下错误:

The type of one of the expressions in the join clause is incorrect.  Type inference failed in the call to 'Join'.

当使用下面的代码时

var ccrCodes = (from c in db.CCRCodes
               join i in items on
                new { c.baan_cat_fam_code, c.baan_cat_code } equals
                new { i.baan_cat_family_code, i.baan_cat_code }
               where i => i.contact_dt.Value.Year == date.Year && i.contact_dt.Value.Month == date.Month
               select c).Distinct().OrderBy(c => c.code_desc);

我在 LINQ 中尝试做的是创建一个多条件连接并且遇到了问题。有什么想法吗?

谢谢,

【问题讨论】:

标签: linq linq-to-sql join


【解决方案1】:

尝试为匿名对象中的属性命名:

var ccrCodes = (from c in db.CCRCodes
               join i in items on
                new { FamCode = c.baan_cat_fam_code, CatCode = c.baan_cat_code } equals
                new { FamCode = i.baan_cat_family_code, CatCode = i.baan_cat_code }
               where i => i.contact_dt.Value.Year == date.Year && i.contact_dt.Value.Month == date.Month
               select c).Distinct().OrderBy(c => c.code_desc);

编辑:好吧,我必须承认,我不是查询语法方面的专家,但是您想在进行联接之前过滤“项目”列表,例如以下查询的流畅版本:

db.CCRCodes
    .Join(
        items.Where(i => i.contact_dt.Value.Year == date.Year && i.contact_dt.Value.Month == date.Month),
        x => new { FamCode = x.baan_cat_fam_code, CatCode = x.baan_cat_code },
        x => new { FamCode = x.baan_cat_family_code, CatCode = x.baan_cat_code },
        (o,i) => o
    ).Distinct().OrderBy(c => c.code_desc)

另一个编辑:根据 Ahmad 的建议:

var ccrCodes = (from c in db.CCRCodes
                   join i in items.Where(x => x.contact_dt.Value.Year == date.Year && x.contact_dt.Value.Month == date.Month) on
                    new { FamCode = c.baan_cat_fam_code, CatCode = c.baan_cat_code } equals
                    new { FamCode = i.baan_cat_family_code, CatCode = i.baan_cat_code }
                   select c).Distinct().OrderBy(c => c.code_desc);

另一个编辑:根据 Ahmad 的另一个建议:

var ccrCodes = (from c in db.CCRCodes
                from i in items
                where i.contact_dt.Value.Year == date.Year && i.contact_dt.Value.Month == date.Month 
                  && c.baan_cat_fam_code == i.baan_cat_family_code && c.baan_cat_code == i.baan_cat_code
                select c).Distinct().OrderBy(c => c.code_desc); 

【讨论】:

  • 不,抱歉。我收到以下错误: 1) 无法在此范围内声明名为“i”的局部变量,因为它会给“i”赋予不同的含义,“i”已在“父或当前”范围中用于表示其他内容。 2) 无法将 lambda 表达式转换为类型“bool”,因为它不是委托类型/
  • 查看编辑,您在“where”中声明了另一个名为“i”的变量,这导致了大多数错误。
  • 尝试将where 子句移至items 用法:join i in items.Where(o => o.contact_dt.Value.Year == date.Year && o.contact_dt.Value.Month == date.Month) ...i 不在join 之后的范围内,但c 在使用范围内。编辑:刚刚注意到你流利的语法,关于Where位置的查询语法的想法相同。
  • @Ahmad,你的评论帮助我意识到我可以为这个解决方案混合和匹配一些查询和流利的语法。谢谢!
  • 绝对!将其保留在查询语法中是可能的,但查询会很快变得混乱。应该是join i in (from o in items where ...) ...,所以混合起来会更好看。如果需要查询语法,我最多会将其移至单独的 var 声明,或使用let clause
猜你喜欢
  • 2011-09-09
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
相关资源
最近更新 更多