2017-03-13 58 views
0

我有一个实体除了1列存储逗号分隔的Ids以外的几列。Linq-To-Sql /逗号分隔的Ids在1列/返回逗号分隔1列中的名称

当我将数据返回给客户端时,我需要查询其他表以返回Name而不是Id。

我正在使用Linq-To-Sql。该查询确实将Left Outer连接到许多其他表,但仍然不确定如何处理该属性,该属性应该保留为1列而不是Ids。

var query = (
from poc in _manager.All 
    // Shelter 
    join s in _shelters.GetAll() on poc.Shelter equals s.Id into JoinShelter 
    from sh in JoinShelter.DefaultIfEmpty() 
select new Dto 
     { 
      Id = poc.Id, 
      PocPresent = poc.PocPresent ? "Yes" : "No", 
      Shelter = sh.ShelterName 
     } 

仍然有1个属性称为Languages。这是“1,2”,意思是语言1和语言2

在“POC”的属性是字符串语言=“1,2”

现在,我需要把它作为返回“语言1 ,Lang2“。

Lin-To-Sql有什么用?

感谢

回答

0

您可以在Languages财产使用投影,与Select() LINQ扩展方法。

var query = (
    from poc in _manager.All 
    // Shelter 
    join s in _shelters.GetAll() on poc.Shelter equals s.Id into JoinShelter 
    from sh in JoinShelter.DefaultIfEmpty() 
    select new Dto 
    { 
    Id = poc.Id, 
    PocPresent = poc.PocPresent ? "Yes" : "No", 
    Shelter = sh.ShelterName, 
    Languages = poc.Languages.Split(",".ToCharArray()).Select(l => "Lang"+l) 
    }) 

在这个例子中LanguagesDto上对象属性将是IEnumerable<string>。如果您在csv字符串形式中需要它,您可以通过String.Join方法来完成。

+0

谢谢。但是我有一个很长的查询,在我完成查询构建之前,我没有执行它。上面的代码是否会在查询中运行?如果不是,那么如果我使用String.Join它会在现场运行吗? – Bill

+0

是的,你是对的,'语言'投影不会直接在数据库上进行。它将在服务器的内存中完成。也许你应该专注于从数据库中获取正确的子集,然后可以进行类似的内存转换以显示所需的数据。 –

+0

我尝试了上面的,在我的情况下,它不像“Lang”+1那么简单,我必须查询另一个表以从ID中获取名称。所以,我的财产将是IEnumerable >。 内存不是一个选项,因为我有很多记录返回,所以我想我会将所有复杂性转移到SQL Server上。 – Bill