无法使用LINQ分组进行转换

时间:2018-09-12 14:38:47

标签: c# asp.net-mvc linq

嗨,这就是我到目前为止所拥有的... 在我的控制器中:

public ActionResult SingleFeed (string linename)
{
    var result = (from x in db.is1
                  where x.in_service == "Y"
                  join y in db.isckts on
                  x.is_id equals y.is_id
                  where y.line_name == linename
                  group new {x, y} by x.is_id into xyg
                  where xyg.Count() == 1
                  select xyg);
    var SFM = new CircuitsViewModel()
    {
        IsDetails = result.ToList()
    };

    return View(SFM);
}

我认为:

public class CircuitsViewModel
{
        public List<is1> IsDetails { get; set; }
        public List<isckt> IscktDetails { get; set; }
}

我最终得到

  

无法隐式转换类型   'System.Collections.Generic.List(System.Linq.IGrouping(short,   (匿名类型:is1 x,isckt y)))'至   'System.Collections.Generic.List(is1)

想知道是否有人可以帮助解决此错误。当我尝试使用LINQ分组时开始发生,但我不知道如何为Viewmodel建模或更改LINQ查询以匹配类型。

LINQ查询背后的想法是返回在表isckts的id列中没有重复条目的记录。

更新: 当前试图找出如何在db.isckts.is_ID中查找重复项,然后对IS_ID进行联接,然后在何处指定line_name和in_service

任何帮助将不胜感激!干杯!

2 个答案:

答案 0 :(得分:1)

您似乎只希望db.is1中没有重复的db.isckts匹配行的行,因此您只需要分组并返回is1行。

var result = from x in db.is1
             where x.in_service == "Y"
             join y in db.isckts on x.is_id equals y.is_id
             where y.line_name == linename
             group x by x.is_id into xg
             where xg.Count() == 1
             select xg.First();

但是,由于您只是使用分组来计算联接的行,因此可以使用LINQ Group Join运算符来代替:

var AjoinB = from x in db.tableA
             where x.inservice
             join y in db.tableB on x.is_id equals y.is_id into yj
             where yj.Count(y => y.line_name == linename) == 1
             select x;

我切换到lambda语法以将条件添加到y的计数中;您也可以使用db.tableB方法将条件添加到Where,甚至可以创建一个子查询来表示已过滤的db.tableB

var filtered_isckts = from y in db.isckts
                      where y.line_name == linename
                      select y;
var result = from x in db.is1
             where x.in_service == "Y"
             join y in filtered_isckts on x.is_id equals y.is_id into yj
             where yj.Count() == 1
             select x;

要将filtered_isckts修改为仅包含一行的id,请在第一个查询上进行分组:

var filtered_isckts = from y in db.isckts
                      where y.line_name == linename
                      group y by y.is_id into yg
                      where yg.Count() == 1
                      select yg.First();
var result = from x in db.is1
             where x.in_service == "Y"
             join y in filtered_isckts on x.is_id equals y.is_id
             select x;

答案 1 :(得分:0)

因为linq组不返回List<IsDetails>

您应该使用result.Select(x => new IsDetails {});