Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ to SQL:如何设置两个表之间的关联以填充字符串列表_C#_Linq_Linq To Sql_Associations - Fatal编程技术网

C# LINQ to SQL:如何设置两个表之间的关联以填充字符串列表

C# LINQ to SQL:如何设置两个表之间的关联以填充字符串列表,c#,linq,linq-to-sql,associations,C#,Linq,Linq To Sql,Associations,我有一个包含两个表的简单数据库:Photo和Tag。两个表之间存在一对多(一张照片可以有多个标记)关系。这是一张图表: 现在我已经创建了一个Photo类,并使用属性为LINQ to SQL设置了它。该类的代码如下所示: [Table] public class Photo { [Column(IsDbGenerated = true, IsPrimaryKey = true, CanBeNull = false)] public int ID { get; set; }

我有一个包含两个表的简单数据库:
Photo
Tag
。两个表之间存在一对多(一张照片可以有多个标记)关系。这是一张图表:

现在我已经创建了一个
Photo
类,并使用属性为LINQ to SQL设置了它。该类的代码如下所示:

[Table]
public class Photo
{

    [Column(IsDbGenerated = true, IsPrimaryKey = true, CanBeNull = false)]
    public int ID { get; set; }

    [Column(CanBeNull = false)]
    public string Filename { get; set; }

    [Column(CanBeNull = false)]
    public string Description { get; set; }

    [Column(CanBeNull = false)]
    public DateTime DateTaken { get; set; }


    public List<string> Tags { get; set; }

    public override string ToString()
    {
        string result = String.Format("File: {0}, Desc: {1}, Date: {2}, Tags: ", 
            Filename, Description, DateTaken);
        if (Tags != null)
            foreach (string tag in Tags)
                result += tag + ", ";
        return result;
    }
}
您应该参考msdn上的文章

此外,本文还展示了如何使用关联属性装饰EntitySet属性以完成关系建模

如果我可以直接执行此操作(即,不必设置与标记表相似/相关的标记类),则更好

不可能。LinqToSql需要知道什么是表,什么不是表,这样它才能生成正确的sql文本

相反,您可以做的是创建一组用于表示数据库结构的类型,以及另一组用于程序中其他地方的类型。第二组类型可以有一个表示照片和标记数据的类


使用第一组类型编写查询,然后使用它们构造第二组类型的实例。

首先,我建议您使用工具生成实体类(与数据库表相对应的类)。我们正在使用sqlmetal,它做得很好。
接下来,(如果您有一个标记实体),编写一个函数来获取一些照片的标记:

void GetTags(IEnumerable<Photo> photos)
{
var ids = photos.Select(p=>p.ID).ToList();
var tagsG = (from tag in context.GetTable<Tag>() where ids.Contains(tag.PhotoID) select new {PhotoID, Name}).GroupBy(tag=>tag.PhotoID);
foreach(ph in photos){
ph.Tags = tagsG[ph.ID].Select(tag=>tag.Name).ToList();
}
}
void GetTags(IEnumerable照片)
{
var ID=photos.Select(p=>p.ID.ToList();
var tagsG=(来自context.GetTable()中的标记,其中ids.Contains(tag.PhotoID)选择new{PhotoID,Name}).GroupBy(tag=>tag.PhotoID);
foreach(照片中的ph值){
ph.Tags=tagsG[ph.ID]。选择(tag=>tag.Name)。ToList();
}
}

注意,代码可能无法编译,我在浏览器中编写了它…

所以两张照片不能有一个共同的标记?
void GetTags(IEnumerable<Photo> photos)
{
var ids = photos.Select(p=>p.ID).ToList();
var tagsG = (from tag in context.GetTable<Tag>() where ids.Contains(tag.PhotoID) select new {PhotoID, Name}).GroupBy(tag=>tag.PhotoID);
foreach(ph in photos){
ph.Tags = tagsG[ph.ID].Select(tag=>tag.Name).ToList();
}
}