0

下面是我用来选择的 LINQ 查询ITEMS

protected void Page_Load(object sender, EventArgs e)
{
    whatsmydiscountEntities ctx = new whatsmydiscountEntities();

    int IdRelationshipItems = Convert.ToInt32(Request.QueryString["IdRelationshipItems"]);
    int IdProductService = Convert.ToInt32(Request.QueryString["IdProductService"]);

    var Items = (from es in ctx.State
                join ie in ctx.ItemsStates on es.StateId equals ie.StateId 
                join i in ctx.Items on ie.IdItem equals i.IdItem 
                join iir in ctx.ItemsRelationshipItems on i.IdItem equals iir.IdItem
                join ir in ctx.RelationshipItems on iir.IdRelationshipItems equals ir.IdRelationshipItems 
                join ips in ctx.ItemsProductsServices on i.IdItem equals ips.IdItem 
                join ps in ctx.ProductsServices on ips.IdProductService equals ps.IdProductService
                 where iir.IdRelationshipItems == IdRelationshipItems
                && ips.IdProductService == IdProductService
                && ir.Active == 1 
                && i.Active == 1
                select new
                           {
                               ItemName = i.Name,
                               StateSigla = es.Sigla, 
                               ProductServiceName = ps.Ttitle, 
                               RelationshipItemName = ir.Name, 
                               RelationshipItemImage = ir.Image, 
                               RelationshipItemActive = ir.Active, 
                               ItemSite = i.Site,
                               ItemDescription = i.Description,
                               ItemAddress = i.Address,
                               Iteminformationdiscount = i.information_discount,
                               ItemLogo = i.Logo,
                               ItemActive = i.Active,
                               StateId = ie.StateId, 
                               IdRelationshipItems = iir.IdRelationshipItems,
                               IdProductService = ips.IdProductService
                            }).ToList();
}

如您所见,如果用户通过IdRelationshipItems和,则每个状态的结果将是 1 行IdProductService

而不是每个状态的 1 行具有相同的信息,我只想显示 1 行和所有用逗号分隔的状态。我需要改变什么才能做到这一点?

4

1 回答 1

0

我今天必须解决这个问题。我有一个看起来像这样的视图模型:

public class IndexViewModel
{
    public string Search { get; set; }
    public IPagedList<MembershipUser> Users { get; set; }
    public IEnumerable<string> Roles { get; set; }
    public bool IsRolesEnabled { get; set; }
    public IDictionary<string,string> Tags { get; set; }
}

我需要返回一个唯一的用户列表和所有分配给他们的标签作为逗号分隔的字符串。

数据是这样存储的:

“41FFEC0F-B920-4839-B0B5-​​862F8EDE25BD”,标签1
“41FFEC0F-B920-4839-B0B5-​​862F8EDE25BD”,标签2
“41FFEC0F-B920-4839-B0B5-​​862F8EDE25BD”,标签3

我需要看起来像这样的输出:

“41FFEC0F-B920-4839-B0B5-​​862F8EDE25BD”、“标签 1、标签 2、标签 3”

我最终创建了一个这样的 UserId 列表(我正在使用将 UserId 公开为 ProviderUserKey 的 MembershipProvider):

var userIdList = users.Select(usr => (Guid) usr.ProviderUserKey).ToList();

对象“users”是一个 MembershipUser 对象。然后我在我的服务中调用一个函数,像这样传递列表:

Tags = _usersTagsService.FindAllTagsByUser(userIdList)

我的服务功能如下所示:

public IDictionary<string, string> FindAllTagsByUser(IList<Guid> users)
    {

        var query = (from ut in _db.UsersTags
                    join tagList in _db.Tags on ut.TagId equals tagList.Id
                    where users.Contains(ut.UserId)
                    select new {ut.UserId, tagList.Label}).ToList();

        var result = (from q in query
                     group q by q.UserId
                     into g
                     select new {g.Key, Tags = string.Join(", ", g.Select(tg => tg.Label))});

        return result.ToDictionary(x=>x.Key.ToString(),y=>y.Tags);
    }

我很确定这两个 linq 语句可能可以合并为一个,但我发现这样更容易阅读。仍然只访问数据库一次。

需要注意的事项

  1. 我最初只是将 IList 用户传递给函数 FindAllTagsByUser 并且 linq 无法推断类型,因此不会让我使用 .Contains 扩展方法。一直说 linq to entity 不支持包含。
  2. 您需要在第一个查询上执行 .ToList() 以实现它,否则当您尝试使用 string.Join 创建逗号分隔列表时,您会遇到从 linq 到实体的麻烦。

祝你好运

冲刺

于 2013-05-09T19:32:35.840 回答