Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
.net Linq到Sql多连接表_.net_Asp.net Mvc_Linq To Sql_Join_Many To Many - Fatal编程技术网

.net Linq到Sql多连接表

.net Linq到Sql多连接表,.net,asp.net-mvc,linq-to-sql,join,many-to-many,.net,Asp.net Mvc,Linq To Sql,Join,Many To Many,我是一位经验丰富的Rails开发人员,我想我会尝试ASP.NET版本的MVC。为此,我还决定尝试Linq->Sql 我对Linq->Sql处理连接的方式有点困惑 我的模式的一个简单示例是: 书籍: id 头衔 类别: id 名字 图书分类: 图书id 类别识别码 简单地将这些表拖到.dbml文件似乎做不到这一点。我在我的Book类books\u categories上得到了一个属性,我所期望的是一个可以迭代并直接获得类别类的属性 现在我不得不做一些感觉很不对的事情 foreach

我是一位经验丰富的Rails开发人员,我想我会尝试ASP.NET版本的MVC。为此,我还决定尝试Linq->Sql

我对Linq->Sql处理连接的方式有点困惑

我的模式的一个简单示例是:

书籍
id
头衔

类别
id
名字

图书分类
图书id
类别识别码

简单地将这些表拖到.dbml文件似乎做不到这一点。我在我的Book类books\u categories上得到了一个属性,我所期望的是一个可以迭代并直接获得类别类的属性

现在我不得不做一些感觉很不对的事情

        foreach (books_categories bc in book.books_categories)
        {
            category_names.Add(bc.Category.category.Trim());
        }
[对公认答案的回应]

我勉强接受了“编写自己的胶水代码”的答案。在继续我对Linq->Sql的研究之后,我发现它显然正在慢慢地被抛弃,取而代之的是(更强大的,IMO)实体框架。EF仍然允许用户使用LINQ进行查询,并且能够很好地处理Ruby的ActiveRecord之类的关系

我认为Linq to Sql不支持您预期的结果

你所做的可能感觉不对,但我认为这是克服L2限制的一种方法


伙计,我真的需要进入Rails…

为Book使用部分类实现,并为类别及其属性添加适当的方法。让属性位于Books_Categories属性的前端(您可以使其具有私有可见性,以便通过Categories属性强制实现)

公共部分类书
{
公共IEnumerable类别名称
{
得到
{  
返回此.Books\u类别
.Select(bc=>bc.Category.Category.Trim());
}
}
公共无效添加类别(类别)
{
此.Books\u Categories.Add(新建图书\u类别
{
类别=类别,
书=这个
} );
}
公共无效删除类别(类别)
{
var bc=本书\类别
.其中(c=>c.类别==类别)
.SingleOrDefault();
此.Books_Categories.Remove(bc);
}
}
显然,您需要添加一些错误/边界检查等,但您已经明白了


我承认这并不理想,但至少您可以灵活地确定它的工作方式。

在实体框架中明确支持多对多映射,但在LINQ到SQL中不支持。您还可以使用第三方ORM,如NHibernate。

如果您想创建一本书并直接向其中添加一个类别,您可以做的是: 在你看来:

        <p>
            <label for="CategorySelect">Category:</label>
            <%= Html.ListBox("CategorySelect") %>
            <%= Html.ValidationMessage("CategorySelect", "*")%>
        </p>  

类别:

在您的BookController中:

        public ActionResult New()
    {
            var data = _entities.Categories.ToList();
        ViewData["CategorySelect"] = new MultiSelectList(data, "Id", "Name");
}

        [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult New([Bind(Exclude = "Id")] Book Booknew)
    {
        IEnumerable<int> selectedCategories = Request["CategorySelect"].Split(new Char[] { ',' }).Select(idStr => int.Parse(idStr));

        if (!ModelState.IsValid)
            return View();

        try {
            foreach(var item in selectedCategories){
                BooksCategories bc = new BooksCategories();
                bc.Book = Booknew;
                bc.CategoryId = item;
                _entities.BooksCategories.InsertOnSubmit(bc);
            }
            _entities.Books.InsertOnSubmit(Booknew);
            _entities.SubmitChanges();
public ActionResult New()
{
var data=_entities.Categories.ToList();
ViewData[“CategorySelect”]=新的多选列表(数据,“Id”,“名称”);
}
[接受动词(HttpVerbs.Post)]
public ActionResult New([Bind(Exclude=“Id”)]Book Booknew)
{
IEnumerable selectedCategories=Request[“CategorySelect”].Split(新字符[]{',}).Select(idStr=>int.Parse(idStr));
如果(!ModelState.IsValid)
返回视图();
试一试{
foreach(选定类别中的var项目){
BooksCategories bc=新的BooksCategories();
bc.Book=Booknew;
bc.CategoryId=项目;
_实体。图书分类。InsertOnSubmit(bc);
}
_实体。账簿。InsertOnSubmit(Booknew);
_实体。提交更改();

这让我想知道为什么我会在Ado.NET+Linq上使用Linq->Sql。我认为Linq->Sql会支持ORM,不这样做感觉像是后退了一步。Linq到Sql是ORM(某种程度上)。您不会将LINQ to SQL与不同的ORM一起使用。其他ORM会取代它。其他ORM可能支持也可能不支持LINQ,但大多数都支持它。如果LINQ SQL是一个ORM,那么我希望它能够找出如何自动执行联接(因此是关系部分)您不必自己编写它们……您是否只能在“添加和删除”方法中的这个.Book\u类别中添加一个Book\u类别?编辑错误--我可能键入了代码,然后重命名了属性。将更新。
        public ActionResult New()
    {
            var data = _entities.Categories.ToList();
        ViewData["CategorySelect"] = new MultiSelectList(data, "Id", "Name");
}

        [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult New([Bind(Exclude = "Id")] Book Booknew)
    {
        IEnumerable<int> selectedCategories = Request["CategorySelect"].Split(new Char[] { ',' }).Select(idStr => int.Parse(idStr));

        if (!ModelState.IsValid)
            return View();

        try {
            foreach(var item in selectedCategories){
                BooksCategories bc = new BooksCategories();
                bc.Book = Booknew;
                bc.CategoryId = item;
                _entities.BooksCategories.InsertOnSubmit(bc);
            }
            _entities.Books.InsertOnSubmit(Booknew);
            _entities.SubmitChanges();