NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Adam Gajdečka:27.7.2017 9:41

Zdravím, potřebuji pomoc. Potřebuji do var campaigns dostat jen kampaně, které jsou v dané kategorii (id). V db u každé kampaně je string CategoryIds, který odděluje id kategorií znakem ;

Potřebuji ověřit, zda v těchto CategoryIds je obsaženo číslo kategorie (id) a pokud ano, tak aby tato kampaň byla obsažena v var campaigns a já ji nakonec mohl vypsat.

Díky za pomoc

CategoryContro­ller.cs:

private ApplicationDbContext db = new ApplicationDbContext();



    // GET: Category/1/name-of-category
    public ActionResult Index(int id, string name, string sortOrder, string currentFilter, string searchString, int? page)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        ViewBag.CurrentSort = sortOrder;
        ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
        ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";

        if (searchString != null)
        {
            page = 1;
        }
        else
        {
            searchString = currentFilter;
        }

        ViewBag.CurrentFilter = searchString;


        var categories = from s in db.Categories select s;


        var campaigns = from s in db.Campaigns
                        select s;
        if (!String.IsNullOrEmpty(searchString))
        {

            /*

                  string[] cislaS = n.Split(';');

          */


            string CatIds = "";

            for (int i = 0; i < db.Categories.Count(); i++)
            {
                campaigns = campaigns.Where(s => s.Name.Contains(searchString)




                );
            }


            /*   campaigns = campaigns.Where(s => s.Name.Contains(searchString) && s.CategoryId == id
                                        || s.Description.Contains(searchString) &&  s.CategoryId == id);*/
        }
        else
        {


        }
        switch (sortOrder)
        {
            case "name_desc":
                campaigns = campaigns.OrderByDescending(s => s.Name);
                break;

            default:  // Name ascending
                campaigns = campaigns.OrderBy(s => s.Name);
                break;
        }

        int pageSize = 10;
        int pageNumber = (page ?? 1);



        return View(campaigns.ToPagedList(pageNumber, pageSize));
    }
Editováno 27.7.2017 9:42
 
Odpovědět
27.7.2017 9:41
Avatar
Odpovídá na Adam Gajdečka
Marian Benčat:27.7.2017 20:13

No.. EF neumí SPLIT().. takže máš více možností..

  1. Materializovat si to do paměti (případně to převést na IEnumerable) a pak to udělat v paměti:
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Campaign
    {
        public string CategoryIds;

        public Campaign(string categoryIds)
        {
            CategoryIds = categoryIds;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var campaigns = new List<Campaign>
            {
                new Campaign("2;5;8;7"),
                new Campaign("2;5;77;7"),
                new Campaign("2;4;14;7"),
                new Campaign("2;3;77;7"),
                new Campaign("2;554;77;45"),
            };

            int toFindId = 5;

            var found =
                campaigns.Where(
                    campaign => campaign.CategoryIds.Split(';')
                        .Any(id => int.Parse(id) == toFindId)
                ).ToList();
        }
    }
}
  1. Použít Contains na ";ID;" OR StartsWith: "ID;"
  2. Pokud jsi znalý SQL a EF, tak si můžeš tu funkci Split napsat :-)

Samozřejmě je nejlepší nevymýšlet PHP-like chujoviny a nervat více FK klíčů do jednoho fieldu jen proto, že neumíš relační databáze..

Editováno 27.7.2017 20:15
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
27.7.2017 20:13
Totalitní admini..
Avatar
zelvicek
Člen
Avatar
zelvicek:28.7.2017 6:35

.Where(campaign => (";"+campaign­.CategoryIds+";")­.Contains(";"+to­FindId+";")
Netestoval jsem, jak vypadá dotaz do DB, ale snad to pošle stejně jako v C# (tedy sčítání stringů a "like" místo "Contains").

 
Nahoru Odpovědět
28.7.2017 6:35
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.