linq加入错误的语法错误

时间:2015-12-04 06:36:41

标签: c# linq

我正在使用LINQ查询来获取具有特定条件的行。这是查询。

var query = from v in dt1.AsEnumerable()
      join c in dt2.AsEnumerable() on v.Field<int>("ID") equals c.Field<int>("ID")
      where v.Field<string>("col1").Equals("abcd") 
      && (c.Field<string>("col1").Equals("8776") || c.Field<string>("col1").Equals("8775"))
      select new 
          {
             ok = (from a in v where v.Field<string>("stah").Equals("1") select a).count(),
             ok1 = (from a in v where v.Field<string>("stah").Equals("2") select a).count(),
             ok2 = (from a in v where v.Field<string>("stah").Equals("3") select a).count()

          };

错误出现在

ok = (from a in v where v.Field<string>("stah").Equals("1") select a).count()

错误是

  

无法找到源类型的查询模式的实现   &#39;的System.Data.DataRow&#39 ;. &#39;凡&#39;找不到

示例输入: DT1

iD      col1      stah
1       4567        1
2       8748        2
3       3487        3
4       8776        1

DT2

iD      col1
1       4754
2       4576

输出

Get count of all rows where stah=1 && dt2.col1='4754'

但我无法让它发挥作用。这个的正确语法是什么?

2 个答案:

答案 0 :(得分:2)

如果我理解正确,那么这就是你所需要的: -

var query = dt1.AsEnumerable()
               .Where(x => x.Field<int>("stah") == 1 
                       && dt2.AsEnumerable()
                             .Any(z => z.Field<int>("Id") == x.Field<int>("Id") 
                                      && z.Field<string>("Col1") == "4754")
                     ).Count();

答案 1 :(得分:1)

@HarshitShrivastava提到我之前对查询的尝试没有考虑到所有where条件。

使用Linq查询和Linq Lambda的混合版本如何:

var query = from dataRows1 in dt1.AsEnumerable().Where(r => r.Field<string>("col1").Equals("abcd"))
               join dataRows2 in dt2.AsEnumerable().Where(r => r.Field<string>("col1").Equals("8776") || r.Field<string>("col1").Equals("8775"))
                  on dataRows1.Field<int>("ID") equals dataRows2.Field<int>("ID") into b
    select new
    {
        id = dataRows1.Field<int>("ID"),
        ok = (from a in b where a.Field<string>("stah").Equals("1") select a).Count(),
        ok1 = (from a in b where a.Field<string>("stah").Equals("2") select a).Count(),
        ok2 = (from a in b where a.Field<string>("stah").Equals("3") select a).Count()
    };

注意:我在投影输出中包含了ID字段,仅用于验证结果。根据需要删除。