2

所以我很困惑。我有两张表,一张是位置分配,其中包括:位置 ID、类型和类型 ID。我还有一个名为 services 的表,它由 name、id、description 和 icon 组成。

这个想法是说,让我返回所有 13 个服务,从中我们创建 13 个复选框。然后我们说,检查位置分配表,如果此服务(基于类型、id 和位置 id)与该列表中的服务匹配,请选中复选框,否则不选中。

我到目前为止是:

    public static IEnumerable<Constants.Assignable> getAllService(int id)
    {
        List<Constants.Assignable> assign = new List<Constants.Assignable>();

        using (var db = new Context())
        {
            var serv =  from s in db.Services
                        join la in db.LocationAssignments on s.id equals la.typeId into LocationAssignments
                        from la in LocationAssignments
                        where la.locationId == id && s.id == la.typeId && la.type == Constants.SERV
                        select s;

            foreach(var s in serv)
            {

                assign.Add(new Constants.Assignable(){
                    id = s.id, name = s.name
                });
            }

            return assign;
        }
    }

它返回我,目前,两个服务,当它应该返回我 13。所以我的加入有问题。

从那里我们做:

    <h3 class="muted">Services Nearby</h3>
    IEnumerable<UFA.Location.Core.Constants.Assignable> ServicesNearby = UFALocationApp.Helpers.LocationHelper.QueryHelper.getAllServicesNearby(Model.id);
    foreach (var servicenb in ServicesNearby)
    {
        <div class="control-group">
            <label class="control-label" for="serviceNearBy">
            @servicenb.name
            </label>
            <div class="controls">
                <input type="checkbox" id="Locationservice" value="@servicenb.id" name="serviceNB" checked="@(servicenb.assigned ? "checked" : "")" />
            </div>
        </div>
    } 

它打印出两个复选框,在这种情况下被选中。应该还有 11 个未选中。

我必须在查询中更改哪些内容:获取所有服务并仅检查与此位置关联的服务?

4

2 回答 2

0

如果我读得很好,你会追求这样的东西:

var assign = (from s in db.Services
              select new Constants.Assignable
              {
                  id = s.id, 
                  name = s.name,
                  checked= db.LocationAssignments.Any(la => la.typeId == s.id)
              }).ToList();

checked现在,您可以通过单击复选框来更改 的值,并在回发时处理更改。

于 2013-05-13T22:00:36.020 回答
0

要使其成为LEFT JOIN,您需要使用DefaultIfEmpty(),看来您缺少使这项工作起作用的组件;

var serv =  from s in db.Services
            join la in db.LocationAssignments on s.id equals la.typeId 
                into LocationAssignments
            from la in LocationAssignments.DefaultIfEmpty()
            where la.locationId == id && s.id == la.typeId 
               && la.type == Constants.SERV
            select s;
于 2013-05-13T19:42:18.690 回答