如何使用LINQ to SQL将单行添加到列表中?

时间:2012-07-12 13:21:47

标签: c# asp.net linq-to-sql

所以我有一张办公地点表,每列都包含相关信息(即办公室名称,地址,城市,州,邮编,国家)。

我在界面中设置了用户选择他们的办公室,剩下的就是为他们填写。

我知道如何使用通用列表并使用一行包含多行填充它,因为我使用下拉菜单填充了该列,该列表列出了同一个表中的办公室位置。

我不知道如何使用单行中的多列填充通用列表。

例如,以下是我对前者的代码,它可以正常工作:

    private List<string> selectLocs()
    {
        Locs offLoc = new Locs();

        List<string> objList = new List<string>();

        var select = from l in offLoc.Locations
                     orderby l.OFFICE
                     select l;

        foreach (Location loc in select)
        {
            objList.Add(loc.OFFICE);
        }

        return objList;
    }

以下是后一种情况的代码,不完整,因为我不知道如何做同样的事情:

    private List<string> selectAddr(string strLoc)
    {
        List<string> objList = new List<string>();

        Locs offLocs = new Locs();

        var select = from l in offLocs.Locations
                     where l.OFFICE == strLoc
                     select l;

        //foreach what? in select? Do I even use a foreach loop?


        return objList;
    }

不知道为什么之前没有人问过这个问题。

3 个答案:

答案 0 :(得分:4)

您可以简化第一种方法:

private List<string> SelectLocations()
{
    Locs offLoc = new Locs();
    return (from l in offLoc.Locations
            orderby l.OFFICE
            select l.OFFICE).ToList();
}

你的第二种方法:

private List<string> SelectAddresses(string strLoc)
{
    Locs offLocs = new Locs();
    return (from l in offLocs.Locations
            where l.OFFICE == strLoc
            select l.ADDRESS).ToList();
}

更新:如果您需要多个属性,则返回完整位置对象:

private List<Location> SelectLocations(string strLoc)
{
    Locs offLocs = new Locs();
    return (from l in offLocs.Locations
            where l.OFFICE == strLoc
            select l).ToList();
}

还要尽量避免使用匈牙利表示法(在变量名称中添加前缀,这些变量名称描述变量类型)。您可以使用strLoc而不是locationName

答案 1 :(得分:3)

你的第一种方法可能是

return new Locs().Locations.OrderBy(m => m.Office).Select(l => l.OFFICE).ToList()

您的第二个查询可能不会返回List,而是返回位置

private Location selectAddr(string strLoc)
{
    return new Locs().Locations.FirstOrDefault(m => m.OFFICE == strlLoc);
}

或者如果你想要一个ADDRESS列表(这不是很清楚)

private IList<string> selectAddr(string strLoc)
{
    return new Locs().Locations.Where(m => m.OFFICE == strlLoc)
    .Select(l => l.ADDRESS).ToList();
}

或地点列表

private IList<Location> selectAddr(string strLoc)
{
    return new Locs().Locations.Where(m => m.OFFICE == strlLoc)
    .ToList();
}

答案 2 :(得分:2)

Sephethus。以上所有答案都是有效的,但我不确定他们是否回答了您的问题。你问的是如何从一行返回多列?

您可以在此处使用匿名类型来提供帮助,例如:

private IList<string> selectAddr(string strLoc)
{
    Locs offLocs = new Locs();
    var xx = (from l in offLocs.Locations
            where l.OFFICE == strLoc
            select new { l.Address1, l.Address2, l.County });

return xx.Select(a=>String.Concat(x.Address1, x.Address2, x.County).ToList();

}

但是,您可以进一步简化这一过程,

private IList<string> selectAddr(string strLoc)
    {
        Locs offLocs = new Locs();
        return (from l in offLocs.Locations
                where l.OFFICE == strLoc
                select String.Concat(l.Address1, l.Address2, l.County)).ToList();

    }

或者更好

var offLocs = new Locs();
return offLocs.Where(o=>o.Office = strLoc).Select(l=>String.Concat(l.Address1, l.Address2, l.County)).ToList();

但那只是品味问题!